2017-05-29 14 views
0

fwriteを使用して配列の要素を保存していますが、先に保存したデータをfreadを使用して配列にロードしようとしています。 freadの戻り値はゼロではありません。これは成功したことを意味します。しかし、私が配列を印刷すると、それは空です。何も印刷されません。私はファイルからロード配列

fwrite(num, sizeof(int), k, q); //num is the same array, k=no of elements, q is the file pointer 

としてファイルへの配列を保存した は、ここに私のコードです:

int num[50], NoOfElement; 
FILE *p; 
if(p = fopen("data.txt", "rb") == NULL) 
{ 
    printf("Error"); 
    exit(1); 
} 
fseek(p, 0, SEEK_END); 
NoOfElement = ftell(p)/sizeof(int); //no of elements in the file 
fseek(p, 0, SEEK_SET); 
fread(num, sizeof(int), NoOfElement, p); 
+1

'p'? '解放された' ??? –

+0

配列を空にすることはできません。 –

+0

申し訳ありません、それは 'fread'で' p'はファイルポインタです –

答えて

1

あなたのコードは罰金です。このデモプログラムは私にとってはうまくいきます。

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int num[50], NoOfElement; 
    FILE *P; 
    int i; 

    // Generate test data 
    for (i = 0; i < 5; ++i) 
     num[i] = i+1; 

    // Write test data 
    P = fopen("data.txt", "wb"); 
    fwrite(num, sizeof(int), 5, P); 
    fclose(P); 

    // Overwrite the test data so we know we read it OK 
    for (i = 0; i < 5; ++i) 
     num[i] = -1; 

    // Your code for reading test data 
    if((P = fopen("data.txt", "rb")) == NULL) 
    { 
     printf("Error"); 
     exit(1); 
    } 
    fseek(P, 0, SEEK_END); 
    NoOfElement = ftell(P)/sizeof(int); //no of elements in the file 
    fseek(P, 0, SEEK_SET); 
    fread(num, sizeof(int), NoOfElement, P); 

    // Output test data (shows 1 -> 5 as expected) 
    for (i = 0; i < NoOfElement; ++i) 
     printf("%d\n", num[i]); 
} 
+0

それは動作していないと思います。ファイル –

+0

@mukeshbhadotri働いています。私の例では、元の値が表示されていないことを証明するために値を '-1'に書き換えます。ファイルから読み込んでメモリに戻す必要があります。ファイルから何も表示されません。コードをコピー&ペーストして自分で実行して確認することができます。 – aardvarkk

0

私には2つの問題があります。 1つは、宣言されていない変数p(あなたはFILE *P;と宣言していて、Cは大文字と小文字を区別します)を使用することです。

しかし、それは実際のコードではなく、転写のタイプミスであると仮定すると、バッファオーバーフローの問題もあります。 NoOfElement > 50の場合、未定義のビヘイビアが呼び出され、スタックが破損する可能性があります。

どのように配列を印刷していますか。

+0

'NoOfElement'は決して50より大きいことはありません。なぜなら、最初にファイルのバイト数を計算せず、それを' sizeof(int) 'で割っているからです。その配列の要素(> 50)はそのファイルに格納されているため、それ以上の値にはできません –

+0

しかし、ファイルは '50 * sizeof(int)'より大きい可能性があります( 200、32ビットintと仮定)バイト –

+0

'50 * sizeof(int)= 200bytes'だが、' NoOfElement = 200bytes/sizeof(int) '(結果は50) –

関連する問題