2014-10-08 80 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在隨後的每一次閱讀之前,該位置。 – Icemanind 2014-10-08 22:27:08

+0

您在這裏泄漏文件描述符。至少可以說。 – wildplasser 2014-10-08 22:27:38

+1

每次調用函數時都重新打開文件。試着通過在方法外執行該操作,或者在打開文件之前檢查該文件是否爲NULL。 – dramzy 2014-10-08 22:28:58

回答

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. get_number返回int而不是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); 

我做你的函數void,因爲這裏的回報率是沒有意義的,您可以更改和使用的atoi和返回fonction

+0

它應該檢查'fgets'的返回值。用fgets的支票更新了 – BLUEPIXY 2014-10-08 22:39:34

+0

。 – Mekap 2014-10-08 22:43:24