2016-02-14 36 views
0

未來線我有一個看起來像這樣的文件:讀取一個文件(在C)

This is the first line in the file 

This is the third line in the file 

在那裏我有文件(第2行)在一個空行。我想逐行閱讀文件(我使用fgets),但是接下來我想要提前閱讀,只需檢查文件中是否有空行。

但是,我的while fgets有一個break語句,因爲我的函數只能這樣構成,每次函數調用一次讀取一行文件。

,所以如果我調用該函數:

func(file); 

它會讀的第一行,然後打破。

如果我再次調用它,它會讀取第二行再突破,等等

因爲我要實現這種方式,很難預讀,有什麼辦法可以做到這個?

這是我的代碼:

int main(void) { 
    FILE * file; 

    if(file == NULL){perror("test.txt"); return EXIT_FAILURE;} 

    readALine(file); 

} 

void readALine(FILE * file) { 

    char buffer[1000]; 

    while(fgets(buffer,sizeof(buffer),file) != NULL) { 
     //Read lines ahead to check if there is a line 
     //which is blank 

     break; //only read a line each FUNCTION CALL 
    } 


} 

所以要澄清一下,如果我是整個文件讀取一次(只有一個函數調用),它會是這樣的(這是很容易實現的)。

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

     if(file == NULL){perror("test.txt"); return EXIT_FAILURE;} 

     readALine(file); 

    } 

void readALine(FILE * file) { 

    char buffer[1000]; 

    while(fgets(buffer,sizeof(buffer),file) != NULL) { 

     if(isspace(buffer[0]) { 
      printf("Blank line found\n"); 
     } 
    } 


} 

但因爲我讀(逐行,每個函數調用)的文件,第二個代碼塊以上是行不通的(因爲我每讀行突破,這我不能改變)。

有沒有一種方法可以使用fseek來實現這個目標?

+2

是的,'fseek'和'ftell'是爲了做這樣的事情。 – usr2564301

+0

如果'fopen'失敗,您的程序報告成功似乎很奇怪。強烈推薦'if(file == NULL){perror(「test.txt」); return EXIT_FAILURE;}' –

+0

我更新了代碼,雖然fopen肯定不會失敗。 – TESTJ

回答

0

您可以通過簡單地將您的位置存儲在文件中(使用position = ftell(your_file)),然後閱讀該行,如果這是一個空白行,請執行任何您需要做的事情,然後返回到您所處的位置(與fseek(your_file, position, SEEK_SET))。

希望這會有所幫助!

+0

position = ftel(your_file)是這個當前行還是下一行? – TESTJ

+0

這會告訴你文件中的當前位置,所以你必須在讀取你的行之前調用它,這樣你就有了一個可以返回的「備份」。 – haltode

0

readALine中的while循環讀取行直到文件結束。所以它會跳過空行和所有其他行。

您可以從內環路返回,如果你找到一個非空行:

while(fgets(buffer,sizeof(buffer),file) != NULL) { 
    if (buffer[0] != '\n') 
     return; 
} 

如果你也想跳過這包括什麼,但空格線,你可以寫,做了功能檢查:

bool isNothingButWhitespace(char *s) { 
    while (*s == ' ' || *s == '\n') 
     s++; 
    return *s == '\0'; 
} 

這將找到不是空白的第一個字符。如果它是字符串終結符'\ 0',那麼它將返回true(字符串只是空白),否則返回false(發現了一些非空白字符)。

如果readALine中的while循環由於到達文件末尾而完成,則需要某種方式將其返回給調用者。我建議設置緩衝區[0] ='\ 0'。

1

以無條件中止結束的while循環是if語句,所以我不明白爲什麼要使用while循環。我還假設你並不擔心單行比1000字更長。

continue語句跳轉到循環的下一次迭代並再次檢查條件。

void readALine(FILE * file) { 

    char buffer[1000]; 

    while(fgets(buffer,sizeof(buffer),file) != NULL) { 

     if(!isspace(buffer[0]) { //note the not operator 
      //I'm guessing isspace checks for a newline character since otherwise this will be true also for lines beginning with space 
      continue; //run the same loop again 
     } 
     break; 
    } 

    //buffer contains the next line except for empty ones here... 


}