3

変数を読み取って入力しようとしているファイルがあります。ファイルはこれで構成されています:

0\ttake a nap\n
1\tstudy heap-based priority queue\n
101\treview trees for Midterm 2\n
3\tdo assignment 7\n

これは読みにくいかもしれませんが、最初に整数、タブ、その後の文字列、改行が続くことがわかります。整数を取得して変数に入れ、タブを検出し、タブに続く文字列を変数に入れ、改行を検出し、2つの変数を取得して情報を含むノードを作成してから、最初からやり直す必要があります。次の行。何時間もインターネットを精査した後、これが私が思いついたものです。

char activity[SIZE];
 char position[SIZE];
 char line[100];

  FILE *infile;
  char *inname = "todo.txt";

  int i = 0;


  infile = fopen(inname, "r");
  if (!infile) {
    printf("Couldn't open %s for reading\n");
    return 0;
  }
while(i < 100 && fgets(line, sizeof(line), infile) != NULL){
        sscanf(line, "%s\t%s", position, activity);
        printf("%s\n", position);
        printf("%s\n", activity);
        i++;
    }

上記のtxtファイルでこのテストコードを実行すると、結果として次のようになります。

0
take
1
study
101
review
3
do

したがって、最初の数値を(文字列として)正常に取得して変数に入れ、タブを確認し、タブの後の最初のシーケンスを取得して、他の変数に入れた後にそこで停止しているように見えます。この状況を修正するにはどうすればよいですか?

4

2 に答える 2

5

sscanfあなたは:を変更してみることができます

sscanf(line, "%s\t%[^\n]", position, activity);

空白が検出されると、%s指定子は停止します。そのため、スタディヒープベースの優先キューではなくスタディのみを読み取ります。はそれを伝えます:「改行まで読んでください」。別の問題:によって返される値をテストして、必要な数のオブジェクトが満たされていることを確認する必要があります。%[^\n]sscanf


また、最初の整数を整数として読み取り、に変更positionして、の代わりにint使用することもできます。%d%s

編集

明確にするために、私が提案したのは次のとおりです。

int position;
sscanf(line, "%d\t%[^\n]", &position, activity);
于 2012-06-06T05:39:49.873 に答える
4

以下は私のユースケースでは非常にうまく機能しました。TABで区切られたファイルの最初の2つのフィールドを文字列変数に読み込み、次に各行の残りの部分を最後の文字列変数に読み込みたいと思いました。

コードは次のとおりです。

#include <stdlib.h>
#include <stdio.h>

int main()
{
   unsigned char     string1 [255];
   unsigned char     string2 [255];
   unsigned char     string3 [255];

   /* read from stdin until done */
   while(!feof(stdin))
   {
      fscanf( stdin, "%[^\t]\t%[^\t]\t%[^\n]\n", string1, string2, string3 );
      printf( "%s\t%s\t%s\n",                    string1, string2, string3 );
   }

   return(0);
}

このプログラムを使用してコマンドラインフィルターを作成したため、STDINから読み取っています。

fscanfコードの説明:

%[^\t] - any character that is not a TAB
\t     - the TAB character
%[^\n] - any character that is not a NEWLINE
\n     - the NEWLINE character

したがって、私のfscanfは、最初のTABまでのすべての文字(スペースを含むがTAB自体は含まない)を読み取り、文字列をvar string1に配置し、2番目のTABまでのすべての文字(スペースを含むがTAB自体は含まない)を配置し、文字列を配置します次に、レコードの残りのすべての文字(TAB、スペース、NEWLINEを除くすべて)をNEWLINEまでstring3に読み込みます。

私の実際のプログラムでは、string1とstring2に対して特定の処理を行っています。私の出力は、string3とともにその処理の結果です。言い換えると、私の出力もTABで区切られ、string3の元の内容は変更されていません。

3つ以上のフィールドを持つTAB区切りファイルがある場合、次のことが当てはまります(Linuxの場合)。

cat FILE | ABOVE_PROGRAM > OUT_FILE
diff FILE OUT_FILE       # This should yield nothing (no differences)

うまくいけば、これは他の人がTAB区切りファイルを処理するのに役立つでしょう。

于 2013-11-05T16:06:18.313 に答える