- ベストアンサー
【c++】文字列の操作
- C++の文字列の操作について質問があります。getline関数とstrtok関数を使って文字列を区切り文字ごとに配列に入れたいが、関数同士の型が合わず困っています。解決方法を教えてください。
- C++で文字列の操作について質問があります。getline関数を使ってテキストファイルから1行ずつ文字列を取得し、strtok関数を使って区切り文字ごとに配列に入れたいですが、関数の型が合わずに困っています。どうすれば解決できますか?
- C++の文字列操作に関して質問があります。getline関数を使用してテキストの1行ずつ文字列を取得し、strtok関数を使用して区切り文字ごとに配列に入れたいですが、関数同士の型が合わずに困っています。解決方法を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ん?strtok使わずにstd::string::findとstd::string::substr使えばいいんじゃないの? int main(){ using namespace std; string strText; // char chArray[100]; vector<string> sArray; ifstream fs("test.txt"); //パスで指定されたファイルから1行分の文字列を取得する while( getline(fs , strText , '\n') ){ //区切りごと配列に入れたい // chArray = strtok(strText , ","); sArray.push_back(strText.substr(0, strText.find(0, ","))); } } というか、このプログラムだと、各行の1項目目だけを取得することになるけど、本当にやりたいのはCSVデータを1行ごとに読みとっていくことじゃないんですか? だとしたら、 // 文字列srcを","で分割する // vectorを戻り値にすると余分なコピーが発生するので、分割結果はresultに格納する // (今コンパイルもリファレンス参照もできないので間違いがあるかもしれないけど) void splitText(vector& result, const string& src) { result.clear(); if (src.empty()) return; string::size_type pos = 0; string::size_type new_pos; while ((new_pos = src.find(pos, ",")) != string::npos){ result.push_back(src.substr(pos, new_pos - pos)); pos = new_pos + 1; } result.push_back(src.substr(pos)); } という関数を作って呼び出すか、BoostライブラリにCSV切り出しに使えるものがあるからそれを使えばいいでしょう。
その他の回答 (3)
- hitomura
- ベストアンサー率48% (325/664)
#3ですが すみません、2引数のsubstr呼び出しでミスをしていました。 そのままのコードでは切り出す文字列が想定より1文字分長くなり、','が文字列末に残ってしまいます。 2箇所にでてくるものをそれぞれ、 sArray.push_back(strText.substr(0, strText.find(0, ",") - 1)); result.push_back(src.substr(pos, new_pos - pos - 1)); に換えてください。 それから、前の回答に書いた「BoostライブラリにCSV切り出しに使えるものがある」という話ですが、 http://www.kmonos.net/alang/boost/classes/tokenizer.html で説明されているtokenizerのことです。 Boostライブラリは http://www.boost.org/ から入手できます。
- D-Matsu
- ベストアンサー率45% (1080/2394)
#1です。ちょっと追加。 std::stringとは異なり、Cの文字列は代入演算子ではコピーされません。 専用の関数が用意されている(これが#1でも触れたstrcpy)のでそちらを使いましょう。
- D-Matsu
- ベストアンサー率45% (1080/2394)
std::stringのメンバ関数c_str()を使うとconst char *型で取り出せます。 それをstrcpyで別のバッファに移すなどして処理すればいいでしょう。 なお、strtokの戻り値はchar *型ですからchArrayの宣言は間違っています。
お礼
回答ありがとうございます。 回答の前半部にあるソースコードを使用させていただいたら 難なく作ることが出来ました! ありがとうございました。