限定しりとり

VC++を使用しています。
ファイル形式は、タブ区切りです。
1行ずつ読み込んでいき、
以下の2行目、2列目のように、空の場合、
どのように読み込めばよいでしょうか?

1行目1as[Tab]2rt[Tab]333
2行目erts[Tab][Tab]555
3行目eeety[Tab]444[Tab]888

よろしくお願いします。

A 回答 (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を探す必要なし

テストランしてませんが、こんな感じでできるかと。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/07/01 17:44

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のように
それぞれの項目に入力する方法を
お願いします。

補足日時:2005/06/29 18:38
    • good
    • 0

なるほど、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)

補足日時:2005/06/29 13:00
    • good
    • 0

例示の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);

よろしくお願いします。

補足日時:2005/06/29 11:47
    • good
    • 0

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