1

私はこの問題を乗り越えるためにほぼ4時間を費やしました...

100行を超えるテキストファイルがあります。各行には、コンマで区切られた4つの値があります。各値を抽出して変数(v1 ... v4)に保存できるようにしたい。

ファイルの内容全体を読み取ることはないため、forループを使用しました。今のところ、1を機能させようとしています。

これまでのところ、私は1行を読み取ることができました。私は今、列を分割する必要があります。これは私のUni割り当て用であり、ブーストクラスまたはトークナイザークラスを使用することは許可されていません。getlineとその他の基本的なコマンドだけです。

私はこのコードを持っています:

// Read contents from books.txt file
ifstream theFile("fileName.txt");
string v1, v2, v3, v4, line;

for (int i = 0; i < 1; i++) {
    getline(theFile, line, '\n');
    cout << line << endl;  // This part works fine
    getline(line, v1, ",");  // Error here
    cout << v1 << endl;
    getline(line, v2, ",");  // Error here
    cout << v2 << endl;
    getline(line, v3, ",");  // Error here
    cout << v3 << endl;
    getline(line, v4, '\n');  // Error here
    cout << v4 << endl;
}

theFile.close();

私が得るエラーは-エラー:'getline(std :: string&、std :: string&、const char [2])の呼び出しに一致する関数がありません

どうすればこれを修正できますか?

4

4 に答える 4

2

getlineの区切り文字は文字です。文字列を表す二重引用符を使用","しました(したがって、コンパイラエラーは使用したことを示しますchar[2]-文字列リテラルには追加の「nul」文字が含まれています)。

単一文字の値は、代わりに一重引用符を使用して表されます。

getline(myFile, v1, ',');

編集-getlineがサポートしていない最初のパラメーターとして文字列を渡していることに気づきました(文字列から直接トークンを取得することはできません)。stringstream代わりに文字列を詰め込みたいと思ったかもしれません

#include <sstream>

// etc ...

std::string csv = "the,cat,sat,on,the,mat";
std::istringstream buffer( csv );
std::string token;

while( std::getline( buffer, token, ',' ) )
{
    std::cout << token << std::endl;
}
于 2012-09-02T09:09:01.327 に答える
2

このページによるとgetlinestd::istream最初のパラメータとしてを呼び出す必要があります。

しかしline、タイプstd::stringです。代わりに渡す必要があります。これは、 fromstd::istreamを作成することで実行できます。これはうまくいく可能性があります:std::istringstreamline

string v1, v2, v3, v4, line;
istringstream line_stream;

for (int i = 0; i < 1; i++) {
    getline(theFile, line, '\n');
    cout << line << endl;
    line_stream.str(line); // set the input stream to line
    getline(line_stream, v1, ","); // reads from line_stream and writes to v1
...

についてもっと読みたい場合は、ここstd::istringstreamでそれを行うことができます。

また、上記のページによると、3番目のパラメータはタイプである必要がありますchar。しかし、あなた","は自動的にconst char[2]文字列に変換されるものを渡します。文字には、を使用します'c'

于 2012-09-02T09:11:22.333 に答える
0
string filename, text, line;
vector<string> v1; 
vector<string> v2;
vector<string> v3;
vector<string> v4;
int i = 0, k = 0, n;
cout << "Enter filename." << endl;
cin >> filename;
cout << "How many lines of text are in the file?" << endl;
cin >> n;
cin.ignore(200, '\n');
ifstream file(filename.c_str());
if (!file) {
           cerr << "No such file exists." << endl;
           exit(1);
           }
cin.ignore(200, '\n');
if (file.is_open()) {
    while (file.good()) {
           for (k = 0; k < n; k++) { //Loops for as many lines as there are in the file
                for (i = 0; i < 4; i++) { //Loops for each comma-separated word in the line
                              getline(cin, text, ',');
                              if (i == 0)
                                    v1.push_back(text);
                              else if (i == 1)
                                   v2.push_back(text);
                              else if (i == 2)
                                   v3.push_back(text);
                              else if (i == 3)
                                   v4.push_back(text);
                               }
                              }
                          }
                }
file.close();
return 0;
}
于 2012-09-02T10:58:03.313 に答える
0

std :: getlineには2つのオーバーロードがあります:

istream& getline ( istream& is, string& str, char delim );
istream& getline ( istream& is, string& str );

3つの呼び出しは、1つが必要な場合に、3番目のパラメーターとしてリテラル文字列定数を渡します。文字定数ではなくchar使用します。'"

于 2012-09-02T11:00:34.020 に答える