ファイルの行を逆にすることを目的とした、書き込もうとしているCプログラムがあります。私はまだCが苦手なので(Javaのバックグラウンドを持っていますが)、ポインタなどを間違える可能性が非常に高いですが、毎回マニュアルを参考にしてみました。これはやや課題です。
プログラムのポイントは、ファイルの内容を最大でMAX_LINESまで反転し、各行がMAX_CHARSを超えないようにすることです。私が試したかった方法は次のとおりです。fgetsを使用してファイルから80文字またはEOLまで読み取り、その文字列を保存し、側面のカウンターを使用してEOFまたはMAX_LINESに達するまでプロセスを繰り返します。その後、second_array [counter]から0に変更して、同じ文字列を別の配列に配置するだけです。ただし、実際に文字列を最初の配列に入れる際に問題が発生します。これが私がこれまでに持っているものです:
1 #include <stdio.h>
2 #include <string.h>
3
4 #define MAX_LINES 100
5 #define MAX_CHAR 80
6
7 int main(int argc, char *argv[])
8 {
9 if(argc != 2)
10 goto out;
11 FILE *fp;
12 char *str[MAX_CHAR];
13 char buffer[MAX_CHAR];
14 char *revstr[MAX_CHAR];
15 int curr_line = 0, i = 0, j =0;
16
17 fp = fopen(argv[1],"r");
18
19 out:
20 if (fp == NULL && argc != 2){
21 printf("File cannot be found or read failed.\n");
22 return -1;
23 }
24
25 /* printf("This part of the program reverses the input text file, up to a maximum of 100 lines and 80 characters per line.\n The reversed file, from the last (or 100th) line to the first, is the following:\n\n"); */
26
27 /* fgets reads one line at a time, until 80 chars, EOL or EOF */
28 while(curr_line < MAX_LINES && ((fgets(buffer, MAX_CHAR, fp)) != NULL)){
29
30 str[i] = buffer;
31 ++j;
32 ++i;
33 }
34
35 for(i = 0; i < 4; ++i)
36 printf("%s \n", str[i]);
37
38
39 printf("END OF PROGRAM RUN.");
40 return 0;
41 }
同じディレクトリに、次の行を含む「txt」ファイルがあります。
is this a test
this is a test
this is not a test
ただし、プログラムをコンパイルして実行すると(./a.out txt)、次の出力が得られます。
this is not a test
this is not a test
this is not a test
END OF PROGRAM RUN.
明らかに、これは同じ場所を上書きしていることを意味しますが、これを修正する方法がわかりません(前述のように、ポインターはまだ私にはかなり異質です)。誰かがここで何が起こっているのかを明確にできますか?代わりに2Dアレイを使用する必要がありますか?どんな助けでも大歓迎です。