C でファイルを 1 行ずつ読み取る
質問
ファイルを開き、その内容を 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
、あなたは、単一のバッファにファイル全体を読み込むことができます。あなたが実際にそれらをしたい場合はポインタの配列を設定し、または単にラインの開始を取得するために&buf[n * LINE_LENGTH]
を使用して、のN の
既知の長さの非NUL終端文字列を印刷するには、使用することができます:
printf("line %d = '%.*s'\n", n, LINE_LENGTH, &buf[n * LINE_LENGTH]);
あなたが実際のコードを見たいなら、私はコメントで教えてくださいます。