• ベストアンサー

空の文字が含まれているファイル入出力について

VC++を使用しています。 ファイル形式は、タブ区切りです。 1行ずつ読み込んでいき、 以下の2行目、2列目のように、空の場合、 どのように読み込めばよいでしょうか? 1行目 1as[Tab]2rt[Tab]333 2行目 erts[Tab][Tab]555 3行目 eeety[Tab]444[Tab]888 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.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を探す必要なし テストランしてませんが、こんな感じでできるかと。

SES
質問者

お礼

ありがとうございました。 上記のように行った結果、解決しました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • uyama33
  • ベストアンサー率30% (137/450)
回答No.3

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(); こんな感じです。

SES
質問者

補足

すいません。 質問の仕方が悪かったです。 回答No.2に対する補足のように、 読み込んだ行を、AA, BB, CCのように それぞれの項目に入力する方法を お願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

なるほど、sscanfを使って試してみて、空項目があるとうまく読めなかったわけですね。(ちなみに、補足のプログラムではsscanfの書式指定文字列で区切りの\tが抜けてますよね。) MFCのCStringクラスを使ってよいのであれば、Visual C++ .NET以降をお使いであればCStringクラスにあるTokenizeを使ってみましょう。ヘルプにあるサンプルを見れば、すぐに使い方が分かると思います。 Visual C++ 6.0の場合はCString::Tokenizeがないので、strtokを使うことになるでしょうか。こちらもヘルプにサンプルがあります。

SES
質問者

補足

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)
回答No.1

例示の2行目、2列目のような空項目が存在しないとすれば、読み込み方は分かるのですね。 その場合はどうやって読み込ませますか? 補足にでも書いてみてください。 そのプログラムを叩き台にすれば回答も付きやすいと思います。

SES
質問者

補足

早速の回答ありがとうございます。 読み込ませ方ですが、スペース文字も入っている場合があるので、以下のような感じです。 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); よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • タブ区切りtxtファイルをCSVファイルにしたい

    数値データの入ったタブ区切りのテキストファイルが約80個あり、 それらを全てCSVファイルにしたいです。 テキストファイルのデータ形式は以下のようになっています。 339.54 1091.50 339.92 1091.50 340.30 1091.50 340.68 1057.60 341.06 1028.22 これがあと数百行あります。 コマンドプロンプトでCSVにリネームすると、数値が詰まってしまい、困っています。 例えば上のデータ例であれば、 339.541091.50 のように表示されたCSVファイルになってしまいます。 339.54, 1091.50 のようなカンマ区切りのCSVファイルとして出力する方法はないでしょうか? VBAの知識が少しだけあるので、それを使った方がいい場合は教えて頂けると幸いです。 よろしくお願い申し上げます。

  • エクセルからtxtファイルへの変換

    宜しくお願いします。 txtファイルがあります。 中には、14桁の数字があります。 データが膨大なので編集しやすいようにエクセルで読み込みます。 この数字以外の一部を変更します。(1行削除または1列全部同じデータに修正等) 最後にTAB区切りのtxtファイルで保存すると、この14桁の数字が丸められてしまいます。(例56000500000058⇒56000000000000) 書式の表示形式を文字列にするのはなぜか設定してからセルをダブルクリックしないと元の数字列にならないので5000行もあるデータの編集等やってられません。 何かよい方法ありませんか。 要は、5000行もあるtxtファイルの編集を簡単に行ないたいのです。 たとえば、ある列の5000行をいっせいに0から1に変更したいとか。 簡単そうでなかなか思い浮かびません。

  • ExcelでのCSVファイルの編集について、

    ExcelでのCSVファイルの編集について、 オートフィルタ機能を使いたいため、 ExcelでCSVファイルの編集しようとしているのですが、ちょっと苦戦しています。。。 私が試してみたこと 1.もとのCSVファイルの拡張子を○○.csv → ○○.txtに変更。   ↓ 2.Excelの「開く」からその○○.txtを読み込む。   ↓ 3.テキストファイルウィザードに従い、   1「カンマやタブなどの区切り文字によって~ 」にチェック   2「区切り文字」→ カンマ、「文字列の引用符」 → "   3「列のデータ形式」 → 文字列 ※090などの数字を、90と先頭の0を消されないように 上記のような手順でCSVファイルを取り込み、編集を終え、 保存する時は   「○○.txtにはテキスト(タブ区切り)と互換性のない機能が含まれている可能性があります。    この形式でブックを保存しますか?」 → このまま保存するため「はい」を選択 これでバッチリOK!…かと思われたのですが、 元の編集前の○○.txt は"名前","ヨミ","電話番号1", …… ""とカンマ区切りであったのが、 編集後の○○.txtは名前 ヨミ 電話番号1  …… タブ区切り(?) となってしまっています。 (CSVファイルとしてはタブ区切りでも問題ないのでしょうが…) どうすれば元のカンマ区切りの形式のまま保存できますでしょうか。 アドバイスよろしくお願い致します。

  • Rubyで配列をソートする

    15(tab)5634(改行) 24(tab)4446(改行) 24(tab)8357(改行) 24(tab)3287(改行) 56(tab)5465(改行) 56(tab)1324(改行) 56(tab)7544(改行) 上記のように1行にtabで区切られた2つの数値が並んでいるテキストファイルがあります。 このファイルを、Rubyを使って1列目が同じ数字の行ごとにソートしたいのですが、できなくて困っています。 上の例でしたら、1列目が24の3行を2列目の数値をキーとしてソート、1列目が56の3行を2列目の数値をキーとしてソートするということです。 一行ずつ読み込んで、array = line.split(/\t/)でタブでくぎって配列に格納するスクリプトを書いていたのですが、どうしてもできないので、力を貸していただけないでしょうか。 よろしくお願いします。

  • テキストファイルでタブ文字を何に使うのか?

    一般的なテキストファイルでタブ文字はどのような用途で使用しますか? 私の場合は基本的に、プログラムのソースコードで行頭のインデントにしか使いません。 あと強いて言うならば、TSVファイルの区切り文字として使用したり、構造化テキスト(そういうフリーソフト)のファイル内でのシーケンスとして使う事はありますが、これはテキストファイルではあるのですが、特別なルールのあるやや特殊なファイルといえると思います。なので、少なくとも今回はTSVや構造化テキストは「一般的なテキストファイル」ではないと考えます。 ※ソースコードなどで複数行の桁位置そろえで「行中」に使用しているケースを見たことがありますがよくない例ではないかと思います。 なので私は個人的に、「一般的なテキストファイルではタブ文字は行頭のインデントにしか使わない」と思っています。 これはあっていますか? テキストファイルでそれ以外に使うことってありますか? あるならどのような用途で使用しているのか教えてください。 よろしくお願いします。

  • 行ごとでなく文字列を区切りにファイルを読み込む

     非常の大きなテキストファイルを、1行1行ではなく、特定の文字列、 できれば正規表現を区切りとして、100行ぐらいをまとめて順次読み込みたいのですが、 どのようにすればいいでしょうか。よろしくお願いします。

    • ベストアンサー
    • Java
  • VBAで「,」⇒「.」へ置換後、タグ区切りでテキスト保存したい。

    VBAで「,」⇒「.」へ置換後、タグ区切りでテキスト保存したい。 お世話になっております。 VBAで下記を行いたいと考えております。 全体の流れとしては、テキストを読み込み⇒エクセル上で編集⇒テキスト保存です。 そのエクセル上で編集⇒テキスト保存で悩んでおります。 編集した複数のシートを、個別にタブ区切りのテキストファイルに保存したいと考えております。 出力する際に、小数点の「,」⇒「.」に変換します。 ※小数点を「,」として利用しています(海外対応) 編集するシートは全てのセルが文字列形式になっており、列も行も読み込むテキストによって可変なので、統一されているわけではありません。 最終行はA列ではなくB列でカウントします。 全てのセルに値が入っているわけではなく、空白もあります。 また、各セルには「0.00000」や「02.24」等の数値も入っており、数値形式にしてしまうと0が消えてしまうので、全てのセルを文字列形式として編集しています。 なお、小数点以下の桁数も可変です。 つまり、小数点が「,」となっているのを「.」になおし、タブ区切りのテキストファイルとして保存したいのです。 出力する際に、いったん別ブックに保存⇒不要なシートを削除⇒タブ区切りで保存はできたのですが、自分があまりVBAに詳しくないせいか、これでは文字列形式で保存されなかったため、シートを新規ブックにコピー⇒タグ区切りで保存に変更しました。 しかし、これではcells.replace ~で置換すると、「00,000」が「0」になってしまいました。 ※「22,222」等は問題ないのですが……何故かは分かりませんでした。 ファイルとしては20000万行~25000行程度です。 列としては40列前後になります。 あまりVBAには詳しくないので、まとはずれな事を言っているかもしれません。 何か良い方法はありますでしょうか? 宜しくお願いいたします。

  • テキストファイルのデータ区切り文字(制御文字)について

    テキストファイルにデータを保存しているのですが、区切り文字タブ\tはフィールドの区切りに使っています。 その状態で、仮に1つのフィールドにデータを詰め込む場合、,(カンマ)で区切った場合にデータ自体に金額の,があった場合、誤動作します。フィールドの区切りはタブ\tは普通ですが、1つのフィールドに複数データを持たせる場合の区切り文字は\0など使っても問題ないのでしょうか? 環境はWindows, Linux両方で使います。\0を使ってそれが文字列の最後とまた誤動作しても嫌です。 皆さんは\t以外にテキストデータの区切りにどのような制御文字を使っていますか?ちなみに改行は1レコードの区切り文字です。

    • ベストアンサー
    • Perl
  • 列数の多いエクセルのデータをテキストファイル(スペース区切り)に変換するにはどうしたらいいでしょうか

    列数の多い(200列くらい)エクセルのファイルをテキストファイル(スペース区切り)1行に保存したいのですがどのようにしたらいいのでしょうか. エクセルを普通にテキスト形式で保存すると200列 1行で保存されず,適当に折り返して3行くらいになってしまいます. 例えば 2行200列をテキストにすると 1行目 1~100列 2行目 1~100列 1行目 101~200列 2行目 101~200列   と4行になってしまいます.これを 1行目 1~200列 2行目 1~200列   のようにしたいのですが可能でしょうか.

  • テキストファイルからReadLineで読み込むとタブ文字が削除される。

    tr = New StreamReader("a.txt", System.Text.Encoding.GetEncoding("Shift_JIS"))としたストリームから buff = tr.ReadLine()で1行読み込むとタブ文字が削除されてしまうようなのですが、これを回避する方法は無いでしょうか? 読み込んだ文字列からタブまたはスペースを区切りとして文字列を切り出したいと思っています。 VB2008を使っています。 具体的には、アセンブラのソースファイルからラベル定義を切り出したいと思っています。