2

ファイルを開き、その内容を1行ずつ読み取り、これらの各行を配列に格納するコードを記述しようとしています。

最初にファイルを開いて行数を数えます。各行は固定長なので、次のようにします。

    char buf2[LINE_LENGTH];
    int in2 = open("toSend2", O_RDONLY);
    int number_of_lines = 0;

    for (;;)
 {
  char* p2 = buf2;
  int count = read (in2, p2, LINE_LENGTH);
  if (count < 0)
  {
    printf("ERROR");
    break;
  }
  if (count == 0) break; 

  number_of_lines++;

  printf("count: %d \n",count);
  printf("File 2 line : %s", p2);
  printf("\n");

 }
 close (in2);

これまでのところ、これはうまく機能します。number_of_linesは実際にファイル「toSend2」の行数であり、私の各printfはそのファイルに含まれる行です。

行数で文字列の配列を作成し、基本的にファイル全体をもう一度調べますが、今回は各行を配列に格納します(数を見つけるためのより良い方法がおそらくあります)ファイル内の行の数ですが、私が試したすべてが失敗しました!)

    char * array[number_of_lines];
    int b=0;
    int in3=0;
    in3 = open("toSend2", O_RDONLY);
    for (;;)
 {
  char* p3 = buf3;
  int count = read (in2, p3, LINE_LENGTH);
  if (count < 0)
  {
    printf("ERRORRRRRR");
    break;
  }
  if (count == 0) break;


  array[b] = p3;
  b++;

  printf("count: %d \n",count);
  printf("FILE 2 LINEEEEEE : %s", p3);
  printf("\n");

 }  
 close(in3);

もちろん、これは機能しません。私の各printfは正しい行にファイルの最後の行を加えたものです。たとえば、最初のprintfは次のようになります。

FILE 2 LINEEEEEEE:「ファイルの1行目」「ファイルの最後の行」

そして、このforループの後、配列の内容をトレースすると、その中のすべての項目は単にファイルの最後の行になります。これは、毎回同じポインタ(その時点で別の行を指している)を配列に配置するだけだからだと思いますが、最終的には最後の行を指すため、すべてが最後の行になります。

問題をどのように解決しますか?

ps:私はCを始めたばかりなので、それについての基本的なことさえ知っていると思い込まないでください:(

4

4 に答える 4

6
  • stdio、つまりfopen()fgets()を使用fclose()してI/Oを実行します。正当な理由もなく、はるかに低レベルのPosixスタイルのI/Oを使用しています。
  • 配列に格納するには、新しい各行を動的に割り当てる必要があります。これを行うために使用できますstrdup()
  • 物事がうまくいかない可能性があることを忘れないでください。ファイルのオープンに失敗したり、行の読み込みに失敗したり、メモリの割り当てに失敗したりする可能性があります。これを確認し、それに応じて行動してください。
于 2009-12-07T16:19:08.160 に答える
1

文字列の配列を作成していません。文字列の配列へのポインタを作成しました。行数*1行あたりの文字数になるようにpart2で配列をmallocする必要があります。次に、読み取り行を配列の後続の各位置に移動します。

[編集]
もう1つ.....
文字列はXの長さです。「C」文字列はXの長さではなく、X+1の長さです:
)[/edit]

于 2009-12-07T16:22:05.753 に答える
0

fopenを使用してから、fgetsを使用して各行を取得してみませんか

于 2009-12-07T16:19:56.090 に答える
0

statを使用してファイルサイズを取得できます。それでnumber_of_lines = stat.st_size/LINE_LENGTH

文字列をヌル文字で終了する必要がない場合は、ファイル全体を単一のバッファに読み込むことができます。本当に必要な場合はポインタの配列を設定するか、n&buf[n * LINE_LENGTH]行目の先頭を取得するために使用します。

既知の長さの非ヌル終了文字列を出力するには、次を使用できます。

printf("line %d = '%.*s'\n", n, LINE_LENGTH, &buf[n * LINE_LENGTH]);

実際のコードを見たい場合はコメントで教えてください。

于 2009-12-07T16:33:11.587 に答える