2010-08-23 160 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。