2011-12-04 60 views
0

我是C编程的新手。我试图打开一个文件(juanjo2.klb),它是我用同一​​个程序创建的一个二进制文件,我将在此处显示。问题是我试图使用fprintf()函数将字符串打印到文件中,然后使用fgets()将字符串写入'cad'字符串,然后使用函数printf()打印到屏幕上我从文件读取的字符串。fgets()崩溃我的程序

当我运行该程序时,程序崩溃,Windows(Windows 7)给我一个消息框,说我的程序停止工作,它正在为此问题寻找解决方案。所以我真的不知道我在做什么错误,因为我认为我正确地使用了这些功能。我需要你的帮助。这里是源代码:

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

#define MAXCHARS 20 

int main() 
{ 
    char cad[MAXCHARS]; 
    FILE *pf; 
    char *nombre = "\\juanjo2.klb"; 
    if(pf = fopen(nombre, "a+b") == NULL) 
    { 
     printf("Error opening file\n"); 
     exit(-1); 
    } 

    fprintf(pf, "%s", "Hola como estas"); 

    while(feof(pf) == 0) 
    { 
     fgets(cad, 13, pf); 
     printf("%s", cad);//Here I print the string to the screen. 
    } 

    fclose(pf); //Closing file. 

    system("PAUSE"); 
    return 0; 

}

我使用的代码块IDE 10.05。谢谢你的帮助。

+1

无法使用%s打印二进制数据。一方面,它可能不会被终止。 –

+0

在使用'cad'之前检查'fgets'的返回值。 – Mat

+1

您正在打开用于以二进制模式附加的文件,然后尝试从中读取文件。 – dasblinkenlight

回答

4
if((pf = fopen(nombre, "a+b")) == NULL) 

这是一个经典。

0
... 

int main() 
{ 
    . 
    . 
    . 

    if(pf = fopen(nombre, "a+b") == NULL) 
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

正如@ wildplasser的回答(+1)指出的,你的第一个问题在上面的行中。


这应该是:

if((pf = fopen(nombre, "a+b")) == NULL) 
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

分配FILE *到PF和然后检查它是否NULL


你拥有了它原来的样子,即

if(pf = fopen(nombre, "a+b") == NULL) /* wrong */ 

您正在设置pf为结果t'fopen(nombre,“a + b”)== NULL如果布尔语句(==)为FALSE或!0(通常为1),如果它为true,则该值为0。所以pf的结果是布尔值,而不是实际的文件指针。这也会导致问题,当然,因为它现在正在看pf。

pf = fopen(nomber, "a+b") == NULL; /* here to clarify == happens before = */ 

    if (pf) /* i.e. pf != 0 */