компилятор говорит: не может преобразовать int в FILE * - PullRequest
1 голос
/ 23 августа 2010

Во время выполнения записи я застрял здесь. Условие цикла while не работает.

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;
}

Ответы [ 6 ]

5 голосов
/ 23 августа 2010

Во-первых, вы не хотите использовать while (!feof(pFile)) - никогда!Это почти неизбежно приведет к ошибке, когда последние данные, которые вы прочитали из файла, будут прочитаны дважды.Можно заставить его работать правильно, но только добавив еще одну проверку в середине цикла для выхода при достижении EOF - в этом случае само условие цикла никогда не будет использовано (т. Е. Другой проверкой является та, котораяфактически выполнит работу по выходу из цикла).

Что вы обычно делаете хотите сделать, это проверять EOF, когда вы читаете данные.Различные функции указывают на EOF по-разному.fgets сигнализирует об ошибке (включая EOF), возвращая NULL.Большинство других (getc, fgetc и т. Д.) Возвращают 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, сделайте что-то вроде прочтения оставшейся части строки, покажите его пользователю в предупреждающем сообщении, а затем продолжите чтение оставшейся части файла.

2 голосов
/ 23 августа 2010

Это зависит от того, как определены pFile и EOF, но я предполагаю, что pFile - это * FILE, а EOF - из stdio.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 голос
/ 23 августа 2010

pFile - указатель на файл.EOF обычно определяется как -1, целое число со знаком.

Что вам нужно сделать - это fopen, убедитесь, что pFile! = NULL, затем вызывайте некоторую функцию в дескрипторе файла, пока эта функция не вернет EOF.Указатель никогда не будет EOF.Но функция, действующая на этот указатель, может вернуть EOF.

1 голос
/ 23 августа 2010

Предполагая, что pFile - ваш дескриптор файла, он не меняется при чтении из файла. EOF возвращается, например, fgetc(). Смотрите, например http://www.drpaulcarter.com/cs/common-c-errors.php#4.2 для общих способов решения этой проблемы.

1 голос
/ 23 августа 2010

вот правильный путь:

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 голосов
/ 23 августа 2010

Я предполагаю, что вы хотите продолжать цикл, пока вы не достигли конца файла.В этом случае вы ищете это:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...