2017-06-16 13 views
-3

バイナリファイルmydata.datに、「これはテストです」という文字列を書きました。これがファイルの完全な内容です。私は文字列を読んでいますが、出力はありません。プログラムはエラーなく実行されます。私が間違っていることは何か考えていますか?ファイル読み込み出力に何も表示されないのはなぜですか?

FILE *f = fopen("mydata.dat", "rb"); 

char content[100]; 

while(fread(content, sizeof(content), 1, f) == 1){ 
    printf("%s", content); 
} 
fclose(f); 
+2

'fread'は、' == '1'ではありません。テキストの場合、 '' rt "'モードでファイルを開いてから 'fgets'を使う方が良いでしょう。 –

+1

@Zakir、 'content'は文字列ですが、'%c'は単一の 'char'_を出力するために使用されますが、それは動作しません。 – ForceBru

+0

@WeatherVane:ファイルはバイナリであり、そのように扱う必要があります。 – 4thSpace

答えて

4

まず、文字を読みたい場合は、fgets()を使用してください。実際にfread()を使用したいとします。

fread()は読んだアイテムの数を返しますので、あなたのケースでは0です。 fread()に100バイトの1要素を読み込むように依頼するため...ファイルが100バイト未満の場合、これは常に0を返します。要素のサイズと要素の数を入れ替えました。

さらに、配列を有効なC文字列にする場合は、最後にNULL終止符バイトを置く必要があります。 fread()はあなたのためにそれをしませんので。

例:ファイルに100バイトがない場合

#include <stdio.h> 

int main(void) { 
    FILE *f = fopen("mydata.dat", "rb"); 

    if (f == NULL) { // Error check 
    perror("fopen()"); 
    return 1; 
    } 

    char content[100]; 
    size_t ret; 

    // We loop on the file to read 99 bytes at each loop 
    // sizeof *content is the size of an element of content 
    while ((ret = fread(content, sizeof *content, sizeof content - 1, f)) > 0) { 
    content[ret] = '\0'; // We use ret to nul terminate our string 
    printf("%s", content); 
    fflush(stdout); // flush the standard output 
    } 

    fclose(f); 
} 
+0

@WeatherVane:このコードを実行しようとすると、何も出力されないので問題ありません。 – 4thSpace

+0

これは保証された動作ですか?コードは 'fflush'なしで私のために働きます。 –

+0

@Stargateur:うまくいきました。ありがとう! – 4thSpace

関連する問題