- ベストアンサー
空の文字が含まれているファイル入出力について
VC++を使用しています。 ファイル形式は、タブ区切りです。 1行ずつ読み込んでいき、 以下の2行目、2列目のように、空の場合、 どのように読み込めばよいでしょうか? 1行目 1as[Tab]2rt[Tab]333 2行目 erts[Tab][Tab]555 3行目 eeety[Tab]444[Tab]888 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ごめんなさい、回答no.2で嘘を書いてました・・・ご指摘のとおり、Tokenizeやstrtokではお望みのことはできません。 やはり自前で\tを探して切るしかないようですね。といっても難しくはありませんが。 CString s("aaa\tbbb\tccc"); CString a, b, c; int idx; idx = s.Find("\t"); // \tを探す a = s.Left(idx); // \tの左側を取る s = s.Mid(idx + 1); // \tの右側だけ残す idx = s.Find("\t"); // \tを探す b = s.Left(idx); // \tの左側を取る s = s.Mid(idx + 1); // \tの右側だけ残す c = s; // 最後は\tを探す必要なし テストランしてませんが、こんな感じでできるかと。
その他の回答 (3)
- uyama33
- ベストアンサー率30% (137/450)
i0 ストリームを使います。 1行まるまる読めます。 ヘッダーファイルは足りなかったら 適当に読み込んでください。 #include "io.h" char user1[64]; char user2[64]; ifstream ifs("user.txt");//テキストファイルです。 ifs.getline(user1, 63); ifs.getline(user2, 63); ifs.close(); こんな感じです。
補足
すいません。 質問の仕方が悪かったです。 回答No.2に対する補足のように、 読み込んだ行を、AA, BB, CCのように それぞれの項目に入力する方法を お願いします。
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
なるほど、sscanfを使って試してみて、空項目があるとうまく読めなかったわけですね。(ちなみに、補足のプログラムではsscanfの書式指定文字列で区切りの\tが抜けてますよね。) MFCのCStringクラスを使ってよいのであれば、Visual C++ .NET以降をお使いであればCStringクラスにあるTokenizeを使ってみましょう。ヘルプにあるサンプルを見れば、すぐに使い方が分かると思います。 Visual C++ 6.0の場合はCString::Tokenizeがないので、strtokを使うことになるでしょうか。こちらもヘルプにサンプルがあります。
補足
Visual C++ 6.0使用しています。 質問の2行目だけを考えて、strtokを使用してみましたが、うまく行きませんでした。 アドバイス、よろしくお願いします。 #include <string.h> #include <stdio.h> char string[] = "erts\t\t555"; char seps[] = "\t"; char *AA, *BB, *CC; void main( void ) { printf( "%s\n:\n", string ); AA = strtok( string, seps ); printf( "AA = %s\n", AA ); BB = strtok( NULL, seps ); printf( "BB = %s\n", BB ); CC = strtok( NULL, seps ); printf( "CC = %s\n", CC ); } 結果 rts 555 : AA = erts BB = 555 CC = (null)
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
例示の2行目、2列目のような空項目が存在しないとすれば、読み込み方は分かるのですね。 その場合はどうやって読み込ませますか? 補足にでも書いてみてください。 そのプログラムを叩き台にすれば回答も付きやすいと思います。
補足
早速の回答ありがとうございます。 読み込ませ方ですが、スペース文字も入っている場合があるので、以下のような感じです。 FILE* fp = fopen(data.txt, "r"); char buf[256]; CString sBuf; while(fgets(buf, 256, fp)) { sBuf = buf; sBuf.Remove('\n'); sscanf(sBuf, "%[^\t]%[^\t]%[^\r]", AA, BB, CC); } fclose(fp); よろしくお願いします。
お礼
ありがとうございました。 上記のように行った結果、解決しました。