2011-04-14 30 views
0

在我的代码中,正如我所知道的,正在写入文件。当我看到在文件中floats.dat我看到的二进制ÍÌ[email protected]@ÍÌÜ@ffFAßOeA^@^@bBf6zE33äCff<83>BÍ̦Bfwrite不能确定为什么

但是我的程序总是最终触发这个if语句此流:

if(fread(inputFloats, sizeof(float), LENGTH, binaryFile) < LENGTH) 
{ 
    fprintf(stderr, "Problem reading some or all data from %s\n\n", binaryFileName); 
    return EXIT_FAILURE; 
} 

是否有人看到一些我做错了吗?下面的完整代码。

#include <stdlib.h> 
#include <stdio.h> 
#define LENGTH 10 

int main(void) 
{ 
    FILE *binaryFile, *textFile; 
    char *binaryFileName = "floats.dat", *textFileName = "floats.txt"; 
    float floats[LENGTH] = {3.2, 3.55, 6.9, 12.4, 14.332, 56.5, 4003.4, 456.4, 65.7, 83.4}; 
    float inputFloats[LENGTH]; 
    int i; 

    if((binaryFile = fopen(binaryFileName, "r+")) == NULL) 
    { 
     fprintf(stderr, "Problem opening %s", binaryFileName); 
    } 

    if(fwrite(floats, sizeof(float), LENGTH, binaryFile) < LENGTH) 
    { 
     fprintf(stderr, "Problem writing some or all data to %s\n", binaryFileName); 
     return EXIT_FAILURE; 
    } 

    printf("DATA WRITTEN SUCCESSFULLY\n"); 

    if(fread(inputFloats, sizeof(float), LENGTH, binaryFile) < LENGTH) 
    { 
     fprintf(stderr, "Problem reading some or all data from %s\n\n", binaryFileName); 
     return EXIT_FAILURE; 
    } 

    for(i = 0; i < LENGTH; i++) 
    { 
     printf("float[%d] = %f\n", i, floats[i]); 
    } 

    return EXIT_SUCCESS; 
} 
+1

对于阅读有单独的文件位置并写在同一个文件?如果不是fread正在尝试阅读那些你刚才写的背后的花车。在这种情况下,使用'rewind(binaryFile)'。 – LumpN 2011-04-14 13:29:05

回答

7
  • 你不和文本数据的工作,所以你应该在打开文件时指定二进制模式。使用r+b代替r+
  • 您需要fseek(binaryFile, 0, SEEK_SET)才能在写入后“倒回”文件。 rewind也可以用于这种情况 - fseek允许您将读/写指针放在任何你想要的位置。
+0

非常感谢Erik。是否有任何堕落使用更简单的调用,如下面使用@steabert - rewind(binaryFile)? – Chris 2011-04-14 13:39:48

+0

此外,我只是在玩,现在它的工作,即使使用'r +'我仍然得到相同的结果。如果将代码移植到不同的系统,并且可能使用不同的fopen实现,并且在用'r +'打开时不接受使用二进制文件,是否将'r + b'指定为代码失败? – Chris 2011-04-14 13:41:16

+1

@Chris Paynter:'rewind'在这里完美无瑕。不过你应该知道'fseek'。 'r + b'确保没有人摆弄嵌入的'\ n' - 它可能不需要在您的平台上 – Erik 2011-04-14 13:46:28

1

FILE结构保留了它当前指向的文件在哪里的记录。由于您刚刚写入binaryFile,因此文件指针位于您编写内容的处。

因此,您在阅读之前需要倒带文件,使用fseek(binaryFile, 0, SEEK_SET);

0

当您完成写入文件时,FILE指针位于它的末尾,所以当然如果您尝试阅读则无法使用。尝试在读取之前使用fseek将指针移至文件的开头。

请避免这种情况:

if((binaryFile = fopen(binaryFileName, "r+")) == NULL) { 

,喜欢这样的:

binaryFile = fopen(binaryFileName, "rb+"); 
if(!binaryFile) { 
+0

在条件清晰可读的情况下,分配没有任何问题。 – Erik 2011-04-14 13:30:12

+0

条件跳转中的'='永远不值得。比对不起更安全。 – 2011-04-14 13:32:55

1

你忘了退你的文件中读取它之前:

rewind(binaryFile);