2010-08-23 157 views
1

虽然做文件im卡在这里。while循环的条件不工作。编译器说不能将int转换为FILE *。编译器说:不能将int转换为FILE *

while(pFile!=EOF); 

我应该将pFile类型化为int吗?我试过了,但它没有奏效。提前感谢。 完整的代码是:

int main() 
{ 
    char ch; 
    char name[20]; 
    FILE *pFile; 
    int score; 
    pFile=fopen("database.txt","r"); 
    if(pFile!=NULL) 
    { 

     while(pFile!=EOF); 
     { 
     fscanf(pFile,"%c",ch); 
     } 
    } 
    else 
    printf("Cant open the file......."); 
     fclose(pFile); 
     return 0; 
} 
+1

建议:不要使用printf(“无法打开文件....”),请尝试perror(name); (在某些情况下,您之前已经将“database.txt”复制到名称中,并且已经处理了缓冲区大小问题)。这会将错误消息放在适当的流中,并且它会提供更多信息。 perror是你的朋友。 – 2010-08-23 16:23:33

+0

@William:谢谢:) – 2010-08-23 16:29:09

+0

在输出中打印错误,但打印ERROR = 0,那是什么? – 2010-08-23 16:34:12

回答

5

首先,你做想用while (!feof(pFile)) - 永远!这样做几乎不可避免地会导致错误,从文件中读取的最后一个数据看起来会被读取两次。可以使其正常工作,但只有在EOF达到时才在循环中间添加另一个检查以退出 - 在这种情况下,循环条件本身将永远不会被使用(即,其他检查是实际上会做退出循环的工作)。

你通常要做什么想要做的就是在读取数据时检查EOF。不同的功能以不同的方式表示EOF。 fgets通过返回NULL来表示失败(包括EOF)。大多数人(GETC,龟etc等)做回EOF,所以你通常是这样结束:

int ch; // Note, this should be int, NOT char 

while (EOF != (ch=getc(pFile))) 
    process(ch); 

或:

char buffer[MAX_LINE_SIZE]; 

while (fgets(buffer, sizeof(buffer), pFile)) 
    process(buffer); 

随着scanf函数,检查成功是多一点复杂 - 它会返回成功转换的次数,所以您要确保它符合您的预期。例如:

while (1 == fscanf(fPfile, "%d", &input_number)) 
    process(input_number); 

在这种情况下,因为我指定的格式串1个转换我用1。但是,也有可能由于EOF以外的原因导致转换失败,因此如果失败,您经常需要检查feof(pFile)。如果它返回false,则执行一些操作,例如读取该行的其余部分,以警告消息的形式显示给用户,然后继续读取文件的其余部分。

1

这里是正确的方法:

c = getc(pFile); 
while (c != EOF) { 
    /* Echo the file to stdout */ 
    putchar(c); 
    c = getc(pFile); 
} 
if (feof(pFile)) 
    puts("End of file was reached."); 
else if (ferror(pFile)) 
    puts("There was an error reading from the stream."); 
else 
    /*NOTREACHED*/ 
    puts("getc() failed in a non-conforming way."); 

fclose(pFile); 
+0

feof? :O ...现在它说恒定出或范围。 – 2010-08-23 16:12:14

+0

这应该是简单的'while(!feof(pFile));'。 – 2010-08-23 16:13:15

+0

@fahad把更多的代码 – Andrey 2010-08-23 16:13:41

1

假设pFile是你的文件句柄,当你从文件中读取这不会改变。例如,EOF被返回。 fgetc()。见例如http://www.drpaulcarter.com/cs/common-c-errors.php#4.2用于解决此问题的常用方法。

+0

getchar()仅适用于stdin。你正在考虑getc()/ fgetc()。 – JeremyP 2010-08-23 16:17:25

0

我猜你想保持循环,而你没有达到文件结束。在这种情况下,你正在寻找这个:

while (!feof(pFile)) 
{ 
    ... 
} 

这就是说,这仍然不是很正确。 feof只会在文件末尾尝试读取超出时才会返回true。这意味着feof可以返回false,但没有更多数据要读取。你真的应该试试你的操作,只检查文件结束,如果它失败:

char buffer[SIZE]; 
while (fgets(buffer, sizeof(buffer), pFile)) 
{ 
    ... 
} 
if (!feof(pFile)) 
{ 
    // fgets failed for some reason *other* then end-of-file 
} 
+0

小心!如果你的循环内容是例如'fgets(line,sizeof(line),fp); fputs(行,stdout);',这将无法正常工作。 – 2010-08-23 16:16:10

2

这取决于什么PFILE和EOF被定义为,但我会asssume是PFILE是*文件和EOF从标准输入输出。H。然后,我想你应该这样做:

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

#define FILENAME "file.txt" 

int main(void) { 
    FILE *pFile; 
    int ch; 

    pFile = fopen(FILENAME,"r"); 

    if (pFile) { 
     while ((ch = getc(pFile)) != EOF) { 
      printf("Read one character: %c\n", ch); 
     } 
     close(pFile); 
     return EXIT_SUCCESS; 
    } else { 
     printf("Unable to open file: '%s'\n", FILENAME); 
     return EXIT_FAILURE; 
    } 
} 

这将产生

$ echo "abc" > file.txt 
$ /tmp/fileread 
Read one character: a 
Read one character: b 
Read one character: c 
Read one character: 
# last character being a linefeed 
1

pFile是指向文件的指针。 EOF通常定义为-1,一个有符号的整数。

你应该做的是fopen,确保pFile!= NULL,然后调用文件句柄上的某个函数,直到该函数返回EOF。指针将(或者更确切地说,应该)永远不会是EOF。但是作用于该指针的函数可能会返回EOF。