2014-10-08 3 views
2

У меня есть текстовый файл с номерами в каждой строке. Я хочу написать функцию в C, которая читает в файле и возвращает следующий номер в файле каждый раз, когда вызывается функция.Прочитайте следующую строку файла при каждом вызове функции

Например, если у меня есть эти цифры:

100 
200 
300 
400 

и функция называется get_number(), если я позвоню get_number() вернет 100, если я буду называть его снова, он будет возвращать 200, и т.д.

Это то, что я написал до сих пор, но каждый раз, когда вызывается функция, он всегда возвращается к первому номеру в текстовом файле.

int * get_number() 
{ 

    FILE* file = fopen("random_numbers.txt", "r"); 
    char line[256]; 

    if (file==NULL) 
    { 
     perror ("Error reading file"); 
    } 
    else 
    { 
     fgets(line, sizeof(line), file); 
     printf("%s", line); 
    } 

    return 0; 
} 
+0

Вы хотите использовать 'ftell()', чтобы получить ваше текущее положение в файле после чтения, и вы захотите использовать 'fseek()' для поиска t o это положение перед каждым последующим чтением. – Icemanind

+0

Здесь вы пропускаете дескрипторы файлов. По меньшей мере. – wildplasser

+1

Вы повторно открываете файл каждый раз, когда вызывается функция. Попытайтесь сделать это один раз, либо сделав это вне метода, либо проверив, что этот файл равен NULL перед открытием файла. – dramzy

ответ

0

вот версия, которая делает именно то, что:

int * get_number(long* pos) 
{ 

    FILE* file = fopen("random_numbers.txt", "r"); 
    char line[256]; 

    if (file==NULL) 
    { 
     perror ("Error reading file"); 
    } 
    else 
    { 
     fseek(file , *pos , SEEK_CUR); 
     fgets(line, sizeof(line), file); 
     printf("%s", line); 
    } 
    *pos = ftell(file); 
    return 0; 
} 

и вы называете его от main как этот

long pos = 0; 
get_number(&pos); 

или еще лучше использовать статическую переменную

int * get_number() 
{ 
    static long pos = 0; 
    FILE* file = fopen("random_numbers.txt", "r"); 
    char line[256]; 

    if (file==NULL) 
    { 
     perror ("Error reading file"); 
    } 
    else 
    { 
     fseek(file , pos , SEEK_CUR); 
     fgets(line, sizeof(line), file); 
     printf("%s", line); 
    } 
    pos = ftell(file); 

    return 0; 
} 
0

Не рекомендуется открывать файл повторно. Вместо открытия файла каждый раз, когда вы вызываете функцию, откройте ее один раз, а затем передайте указатель файла на функцию каждый раз, когда вы ее вызываете.

int * get_number(FILE *file) 
{ 
    char line[256]; 

    fgets(line, sizeof(line), file); 
    printf("%s", line); 

    return 0; 
} 

int main() 
{ 
    FILE *file = fopen("random_numbers.txt", "r"); 

    if (file == NULL) 
    { 
     perror("Error opening file"); 
     return 1; 
    } 

    while (!feof(file)) 
    { 
     get_number(file); 
    } 

    fclose(file); 
} 
0
  1. Открыть файл в вызывающей функции.

  2. Пропустить FILE* до get_number.

  3. Возврат int от get_number, а не int*.

Внесено изменение get_number.

int get_number(FILE* file) 
{ 
    // This is the core functionality. 
    // You should add error handling code 

    int number; 
    int n = fscanf(file, "%d", &number); 
    if (n != 1) 
    { 
     // Add error handling code. 
    } 

    return number; 
} 
0

Это это нормально, потому что вы открываете файл каждый раз, когда вы вызываете get_number(); (Это еще хуже, потому что fclose не называются То, что вы хотите, может быть, это дает дескриптор файла в get_number(), таким образом:.

void get_number(FILE* file) 
{ 

    char line[256]; 

    if (file==NULL) 
     perror ("Bad descriptor given"); 
    else 
    { 
     if (fgets(line, sizeof(line), file) == NULL) 
      perror("Fgets failed"); 
     else 
      printf("%s", line); 
    } 
} 

А что вы хотите, за пределами функции, чтобы сделать следующее:..

FILE * file = fopen("random_numbers.txt", "r"); 
get_number(file); // 100 
get_number(file); // 200 
fclose(file); 

Я сделал вашу функцию пустоту, потому что возвращение здесь бессмысленно Вы можете изменить это и использовать atoi и обратный fonction

+0

Должно быть проверено возвращаемое значение 'fgets'. – BLUEPIXY

+0

обновлен с проверкой fgets. – Mekap

Смежные вопросы