質問

ファイルを開き、その内容を 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 は次のようになります。

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

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

どうすれば問題を解決できるでしょうか?

追記:私は C を始めたばかりなので、基本的なことさえ知っているとは思わないでください :(

役に立ちましたか?

解決

  • 標準入出力を使用します。つまり、 fopen(), fgets() そして fclose() I/Oを実行します。正当な理由もなく、はるかに低レベルの Posix スタイルの I/O を使用しています。
  • 新しい行を配列に格納するには、それぞれの新しい行を動的に割り当てる必要があります。使用できます strdup() これをする。
  • 物事はうまくいかない可能性があることを忘れないでください。ファイルを開けなかったり、行の読み込みに失敗したり、メモリの割り当てに失敗したりする可能性があります。これを確認し、それに応じて行動してください。

他のヒント

あなたは文字列の配列を作成していない、あなたは文字列の配列へのポインタを作成しました。あなたは*行数であることをパート2にシャアあたりの行数をあなたの配列ををmallocする必要があります。その後、配列の各その後の位置にあなたの読み出し線を移動します。

[編集]
もう一つ.....
あなたの文字列は、Xの長さです。 'C' の文字列はXの長さではありません、彼らはX + 1の長さ:)
です [/編集]

なぜないのfopenを使用し、そしてちょうどそれぞれの行を取得する関数fgetsを使う

あなたは、ファイルのサイズを取得するために STAT を使用することができます。その後number_of_lines = stat.st_size/LINE_LENGTH

あなたはNUL終端あなたの文字列を必要としない場合は、

、あなたは、単一のバッファにファイル全体を読み込むことができます。あなたが実際にそれらをしたい場合はポインタの配列を設定し、または単にラインの開始を取得するために&buf[n * LINE_LENGTH]を使用して、のN

既知の長さの非NUL終端文字列を印刷するには、使用することができます:

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

あなたが実際のコードを見たいなら、私はコメントで教えてくださいます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top