2017-05-15 7 views
-1
char * file = malloc(buffer); 
assert(file != 0); 
char str[20]; 

snprintf(file, buffer, "%s/%s", newestDirName, fileInDir->d_name); 
FILE * input = fopen(file, "r"); // read 
fseek(input, 0, SEEK_END); 
fgets(str, 20, input); 
printf("str = %s \n", str); 

私はから読んでいたファイルは、最後の行があります:私はfseek(input, 0, SEEK_END)左端から始まるカーソルで最後の行を取得する考えCプログラミングのfseekとfgetsはここで正しく使用されていませんか?

ROOM TYPE: END_ROOM 

なぜ「ROOM TYPE: END_ROOM

を格納strがされていませんが最後の行の位置。これは間違っていますか?

私はfgets(str, 20, input)が入力から20文字を得てstrという変数に入れたと思っていました。これはchar *です。

しかし、私はstrを印刷するとき、私はSTRの値についてちんぷんかんぷんを取得:

str = ▒▒As= 
+3

あなたは* end *までのすべてを探した後、ファイルから* next *と読み替えると思いますか? –

+3

ファイルの最後まで探します。 'fgets()'が読み込むファイルの最後の後には何もありません。ファイルの終わりの前の最後の行の先頭には移動しません。 'fgets(str、20、input)'は19文字まで読み取り、最後の文字の後ろにヌルバイトを配置することに注意してください。 19行目の文字の前に改行があれば19文字未満、20行目にnullのバイトが追加されます。あなたは常に入力関数からの戻り値をテストすべきです。 'fgets()'の戻り値はEOFを示すNULLになります。また、EOFでは、ストリングは決まった値に設定されていません。 –

答えて

0

あなたはfgetsのを使用する必要がある場合、あなたはthis.Howeverを試すことができ、何も行の文字数を超えていないことを保証しません20文字、特に文字数が各行で可変である場合。

char str[20]={0}; 
FILE * input = fopen("file.txt", "r"); // read 
if(input) 
{ 
    char *ptr;/*Warns you if you have reached the end of the file or some error*/ 
    do 
    { 
     ptr=fgets(str, 20, input); 
    } while(ptr); 
    if(str) 
     printf("str = %s \n", str); 
    fclose(input); 
} 
関連する問題