2014-03-02 149 views
0

我想從輸入文件中讀取一系列字母,直到行的末尾,將這些字母存儲在數組中,並返回每行中讀取的字母數。使用fscanf從文件讀取

注意:我需要使用fscanf,MAX_IN_LENGTH已經使用#define來定義,並且輸入文件已經打開並可以讀取。

以下是我有:

for(i=0; i<MAX_IN_LENGTH; i++) { 
if (fscanf (input, "%c", &sequence[i]) != '\n') 
count++; 
} 
return count; 
+0

而你的問題是......? – herohuyongtao

+0

如何逐行讀取每條序列線 – user3303851

回答

2

fscanf()不會返回它掃描像你認爲的字符值。它返回分配的輸入項的數量,如果失敗則返回EOF

if (fscanf(input, "%c", &sequence[i]) != EOF) { 
    if (sequence[i] == '\n') { break; } 
    count++; 
} 
+0

這些都會在最初的for循環中進行嗎? – user3303851

+0

@ user3303851是的。第一行檢查掃描是否成功,第二行檢查掃描的字符是否爲新行字符。 –

+0

嗯,好吧。我試過了,它返回的是讀取的總字母數,而不是每個序列讀取的字母數。 – user3303851

0

這裏是一個可能的解決方案:

#include <stdio.h>  /* fscanf, printf */ 
#include <stdlib.h>  /* realloc, free, exit, NULL */ 

#define MAX_IN_LENGTH 100 

int read_line(FILE* strm, char buffer[]) { 
    char ch; 
    int items; 
    int idx = 0; 
    if(strm) { 
     while((items = (fscanf(strm, "%c", &ch))) == 1 && idx < MAX_IN_LENGTH) { 
     buffer[idx++] = ch; 
     } 
    } 
    return idx; 
} 

int copy_data(char buffer[], int length, char** s) { 
    static int current_size = 0; 
    *s = (char*)realloc(*s, current_size + length+1); /* +1 for null terminator */ 
    memcpy(*s+current_size, buffer, length); 
    current_size += length; 
    return s ? current_size : 0; 
} 

int main(int argc, char* argv[]) { 
    int line = 0; 
    char buf[MAX_IN_LENGTH] = {0}; 
    char* array = 0; 
    int idx = 0; 
    int bytes_read = 0; 
    if(argc == 2) { 
     FILE* in=fopen(argv[1],"r"); 
     while((bytes_read = read_line(in, buf)) > 0) { 
      printf("%d characters read from line %d\n", bytes_read, ++line); 
      idx = copy_data(buf, bytes_read, &array); 
     } 
     if(array) { 
      array[idx] = '\0'; 
      printf("Complete string: %s\n", array); 
      free(array); 
     } 
     fclose(in); 
    } 

    return 0; 
}