2017-05-29 78 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'? 'freed' ??? –

+0

数组不能为空。 –

+0

对不起,这是'fread'和'p'是文件指针 –

回答

1

您的代码似乎罚款。这个演示程序对我来说OK:

#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

我可以看到两个问题。首先是您使用未声明的变量p(您已声明FILE *P;且C区分大小写)。

但是,假设这是一个转录错字,而不是您的实际代码,您也有缓冲区溢出问题。如果NoOfElement > 50,你会调用未定义的行为和(可能)损坏你的堆栈。

无论如何,您打印数组的方式如何?

+0

'NoOfElement'永远不会大于50,因为首先我计算文件的字节数并将其除以sizeof(int)'。所以它总是小于50.因为该数组的元素(> 50)存储在该文件中,所以它不能高于值 –

+0

但是该文件可能大于'50 * sizeof(int)'( 200,假设为32位整数)字节 –

+0

'50 * sizeof(int)= 200bytes'但是'NoOfElement = 200bytes/sizeof(int)'(结果为50) –