開発環境 VisualC.NET WindowsSDK
メモリに読込んだCSVファイルの処理についてお尋ねします。
csvBuffに読込んだCSVデータを一行ずつ読込んで項目毎に処理をしたいと思っています。
そこで、strtokで一行ずつ処理しようと思っているのですがうまく行きません。
コードは以下のような物を考えました。
char *tokenLine;//一行ごとのポインタ
char *tokenBuf;//1項目ごとのポインタ
OutputDebugString("--読み込み開始\n");
//一行読み込み
tokenLine=strtok(lpszBuf,"\n");
while(tokenLine !=NULL){
tokenBuf=tokenLine;
//一項目読み込み
token=strtok(tokenBuf,",");//※ここで行のポインタが変わってしまう
while(token !=NULL){
OutputDebugStr(token);
token=strtok(NULL,",");
}
tokenLine=strtok(NULL,"\n");
}
このコードで一行目しか読込めません。tokenLineのポインタが次に進まない為で、
中のwhileのtokenの処理をしなければ行毎の読み込みは成功します。
メモリ上のデータを一行づつ読込んで処理する場合ばどのようにするのがいいでしょうか?
strtokの第1引数にNULLを指定したときの仕様を確認してください。
行も区切り文字としてよいならば
token = strtok( buf, ",\n" );
というのはどうでしょうか?(第2引数は区切り文字リスト)
これがダメなら、うまいことNULLになったときに区切り文字を切り替えて処理するのかな。
先に全て\nで区切るほうが楽ですけれどね。。
# ファイルからならfgetsで簡明なんですけど。
strtokの仕様を再確認してコードを書き直しました。
char *token;
OutputDebugString("--読み込み開始\n");
token=strtok(lpszBuf,",");
while(token !=NULL){
//読込んである文字を出力
OutputDebugStr(token);
token=strtok(NULL,",\n");
}
としました。
現在の問題としては、行の最後の文字列が 文字+改行で出てしまってちょっと悩んでます。
>先に全て\nで区切るほうが楽ですけれどね。。
ちょっとこのコード考えてみます。
fgets() で 1 行を読み込んで、strtok() で区切ればどうでしょうか?
今までの事からfgetsでの処理を考えてみました。。こんな感じで大丈夫でしょうか?
FILE *stream;
char line[256]; //一行分のデータ
char *readline;
char *token;
stream=fopen(readFilePath,"r");
if (stream != NULL){
readline=fgets(line,sizeof(line),stream);
while (readline!=NULL){
token=strtok(readline,",");
while(token != NULL){
OutputDebugStr(token);
token=strtok(NULL,",\n");
}
readline=fgets(line,sizeof(line),stream);
}
}
fclose(stream);
fgetsはstrtokと違い、最初と2回目以降が特殊でないので、
while ( fgets( line, sizeof( line ), stream ) != NULL )
{
token = strtok( line, ",\n" );
while ( token != NULL )
{
OutputDebugStr( token );
token = strtok( NULL, ",\n" );
}
}
としたほうが見やすいかな。
ツイート | ![]() |