2017-06-09 3 views
0

構造変数を作成し、関数fwriteを使用してファイルに書き込むプログラムを作成しました。返されるコードは1です(私は構造変数を1つだけ書きました)。 fread関数を使ってファイルを読み込もうとすると、0が返され、変数は完全には埋められません。Windowsでfwrite/freadがうまく動作しない

この問題は、Windows専用です。 Linux(Ubuntu仮想マシン)で同じコードを試してみましたが、うまくいきました。ここで

は構造体である:

struct MyStruct 
{ 
    char comment[40]; 
    int nbpts; 
    float time[4096]; 
    float value[4096]; 
}; 

FILE* fp = fopen(fileTrace, "w"); 
fwrite(&var, sizeof(struct MyStruct), 1, fp); 


fread(&var, sizeof(struct MyStruct), 1, fp); 

任意のアイデア?そうfwrite/freadは、任意のファンキーな文字変換(例えば、プラットフォーム固有の行末用をしない、

fopen(..., "w+") 

をそして、あなたはバイナリモードでそれを開く必要があります。

+2

これらの関数の戻り値はチェックしていません。また、Windosはバイナリの解釈を抑止するためにバイナリファイルを "wb"/"rb"として開くことを好みます。 – tofro

+1

ポインタを読み込みのために移動する 'fseek'関数はどうでしょうか? – tilz0R

+1

'fwrite'と' fread'の間で読み込むためにファイルを閉じて再オープンする必要があります。そうしないと、ファイルを書き込み専用モードで開いたので、ファイル*と* –

答えて

4

あなたはあまりにも読み込むためのファイルを開く必要がありますWindowsの場合):

fopen(..., "w+b") 

あなたは直接fread開始をyどこから読んだようにあなたは、ファイルポインタの位置をリセットする必要がfwritefreadにしたい場合あなたのデータを書きました。

if ((fp = fopen("var.dat", "w+b")) != NULL) { 
     fwrite(&var, sizeof(var), 1, fp); 
     rewind(fp); 
     memset(&var, 0, sizeof(var)); // reset var 
     fread(&var, sizeof(var), 1, fp); 
     // ...   
     fclose(fp); 
    } 

(この例では、最初にファイルポインタを設定するrewindを使用して、あなたの代わりにfseekを使用する必要がある場合があります)


注意の言葉を:要約する

移植性を持たせるには、構造体をディスクに直接書き込むのではなく、実際には直列化してください(つまり、すべてのフィールドをファイルに手作業で書き出します。小さなヘッダでixed)、コンパイラ固有のパディングが問題を引き起こす可能性がある(またはそうする)からです。

-1
int main() 
{ 
    const char *pFIle = "test.txt"; 
    char var[sizeof(struct MyStruct)] = {0}; 
    int ret = 0; 
    FILE* fp = fopen(pFIle, "w+"); 
    ret = fwrite(&var, sizeof(struct MyStruct), 1, fp); 
    printf("fwrite ret =%d;\r\n", ret); 
    fflush(fp); 
    fseek(fp, 0, SEEK_SET); 
    ret = fread(&var, sizeof(struct MyStruct), 1, fp); 
    printf("fread ret =%d;\r\n", ret); 
    return 0; 
} 

私はテストをして、すべてがWindows上でOKです。他の問題がある場合は教えてください。

+0

コードをダンプするのではなく、ソリューションが機能する理由を説明してください。 –

+0

@FedericoklezCulloca、申し訳ありませんが、英語は母国語ではありません。説明しすぎると間違いや誤解を招く恐れがあるので、説明する代わりにコードを追加します。ごめんなさい! – Jimmy

関連する問題