1

アドバイスをお願いできますか?最初のテキストファイルの行からスペースを削除し、「スペースのない新しいテキスト」を2番目のファイルに保存するコードの例を教えてください。おそらくどのように機能するかは理解していますが、プログラミングの初心者であるため、書くことができません。アドバイスありがとうございます。私のコード:

        //read csv file
         void readCSV(istream &input, vector< vector<string> > &output)
            {
                string csvLine;

                while(getline(input, csvLine) )
                {
                    istringstream csvStream(csvLine);
                    vector<string> csvColumn;
                    string csvElement;

                    while(getline(csvStream, csvElement) )
                    {
                        csvColumn.push_back(csvElement);
                    }       
                    output.push_back(csvColumn);
                }
            }


        //save all from csv to txt 
        void saveToTxt()
        {

            fstream file("file.csv", ios::in);

            ofstream outfile;
           outfile.open("file.txt");

            typedef vector< vector<string> > csvVector;
            csvVector csvData;

            readCSV(file, csvData);


            for(csvVector::iterator i = csvData.begin(); i != csvData.end(); ++i)
            {
                for(vector<string>::iterator j = i->begin(); j != i->end(); ++j)
                {

                    outfile<<*j<<endl;

                }



//code for deleting spaces, what i found, but i can't implement to above codes, coz my programming skill are not big

                   string s;   
                          while (getline( cin, s ))
                            {
                            s.erase(
                              remove_if(
                                s.begin(),
                                s.end(),
                                ptr_fun <int, int> ( isspace )
                                ),
                              s.end()
                              );

                            cout<<s<<endl;
4

2 に答える 2

3

宿題の結果として適格とならないソリューションが大好きです。以下は、仕様のコードを作成する方法です。これは、これが実行される方法であり、他の人に少し興味深い読み物を提供する方法であると心から思っているためです。教師に優しいソリューションを作成するために必要なすべてのヒントも含まれています。

#include <algorithm>
#include <cctype>
#include <iterator>

int main() {
    std::remove_copy_if(
        std::istreambuf_iterator<char>(std::ifstream("in.txt").rdbuf()),
        std::istreambuf_iterator<char>(),
        std::ostreambuf_iterator<char>(std::ofstream("out.txt").rdbuf()),
        [](unsigned char c){ return std::isspace(c) && c != '\n'; });
}

C ++ 2011コンパイラを使用できない場合は、ラムダ関数を同じシグネチャを持つ実際の関数に置き換える必要があります。

于 2012-12-25T21:12:42.143 に答える
1

と同じアイデアを使用することで、これを大幅に簡素化できますがremove_if、代わりに、コピーするかどうかを決定するために直接適用します。以下のコードのようなもの。注:テストされていませんが、アイデアが得られることを願っています。

#include <iostream>
#include <iterator>
#include <fstream>
#include <functional>
#include <cctype>
using namespace std;

int main(int argc, char *argv[])
{
    ifstream is("file.csv", ios::in);
    ofstream os("file.txt", ios::out|ios::trunc);
    std::remove_copy_if(
        istream_iterator<char>(is),
        istream_iterator<char>(),
        ostream_iterator<char>(os),
        std::ptr_fun<int,int>(isspace));
    os.close();
    is.close();
    return 0;
}

編集:私はDeitmarを信じることができず、私はほとんど同じ考えを持っていました。

于 2012-12-25T21:19:14.873 に答える