プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。

テキストの操作について質問があります。

getline関数を使用してテキストの1行分を読み込み
その文字列をstrtok関数を使用し区切り文字ごとに配列に入れたいと考えています。
ですがgetlineはstd::string型の変数が必要でstrtok関数はchar型しか受け付けないため
関数同士で型が合わず困っています。
何とか型を合わせる方法は無いでしょうか。
以下にソースコードを記載しますのでご指導お願いします。

int main(){
using namespace std;
string strText;
char chArray[100];
ifstream fs("test.txt");

//パスで指定されたファイルから1行分の文字列を取得する
while( getline(fs , strText , '\n') ){
//区切りごと配列に入れたい
chArray = strtok(strText , ",");
}
}

A 回答 (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切り出しに使えるものがあるからそれを使えばいいでしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

回答の前半部にあるソースコードを使用させていただいたら
難なく作ることが出来ました! ありがとうございました。

お礼日時:2011/10/24 21:57

#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/tokeni …
で説明されているtokenizerのことです。

Boostライブラリは
http://www.boost.org/
から入手できます。
    • good
    • 0

#1です。

ちょっと追加。

std::stringとは異なり、Cの文字列は代入演算子ではコピーされません。
専用の関数が用意されている(これが#1でも触れたstrcpy)のでそちらを使いましょう。
    • good
    • 0

std::stringのメンバ関数c_str()を使うとconst char *型で取り出せます。


それをstrcpyで別のバッファに移すなどして処理すればいいでしょう。

なお、strtokの戻り値はchar *型ですからchArrayの宣言は間違っています。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!