2010-03-03 78 views
10

可以使用哪種方法從C中的文件一次讀取一行?在C中一次讀取一行

我正在使用fgets函數,但它不起作用。 它只讀取空格分隔的標記。

怎麼辦?

+0

所以你不想讀一行,你想讀直到遇到一個空格?或者你是否說fgets停止空間而不是換行符? – 2010-03-03 16:06:29

+0

只應停在換行字符上。 – 2010-03-03 16:21:12

+0

這裏是我的輸入:: START 直流10 乙DS 20 STOP 我:: START 一個 乙 STOP 作爲我的輸出.. – 2010-03-03 16:21:56

回答

12

這應該工作,當你由於某種原因不能使用fgets()

int readline(FILE *f, char *buffer, size_t len) 
{ 
    char c; 
    int i; 

    memset(buffer, 0, len); 

    for (i = 0; i < len; i++) 
    { 
     int c = fgetc(f); 

     if (!feof(f)) 
     { 
     if (c == '\r') 
      buffer[i] = 0; 
     else if (c == '\n') 
     { 
      buffer[i] = 0; 

      return i+1; 
     } 
     else 
      buffer[i] = c; 
     } 
     else 
     { 
     //fprintf(stderr, "read_line(): recv returned %d\n", c); 
     return -1; 
     } 
    } 

    return -1; 
} 
+0

thanx buddy其準備工作但仍有問題.. 我的緩衝區正在讀取和存儲整行 ,但在打印時只有第一個空間分隔符只有 – 2010-03-03 16:36:11

+0

這很奇怪,我可以使用'printf(「%s \ n」,buffer);'它輸出整個緩衝區 – LukeN 2010-03-03 16:38:30

+0

yeh, 對我來說也是很奇怪的。因爲它適用於所有以前的程序...:'( – 2010-03-03 16:48:35

2

fgets()應該要走的路...

+0

只要緩衝區足夠大 – Tom 2010-03-03 16:06:15

+0

湯姆:這是第二個參數的用途,以避免超出緩衝區。或者你的意思是沒有預見足夠大的緩衝區? IIRC,我的C編譯器在各行上有512字節的限制。 – 2010-03-03 16:19:39

+0

哪個C編譯器是?我正在考慮你不知道這條線路有多長的情況,例如stdin。不要試圖就此開始一場神聖的戰爭。 – Tom 2010-03-03 16:58:31

7

fgets功能從文件中讀取或num字符,其中num是傳遞給fgets第二個參數一行。你是否傳遞了足夠多的數字來閱讀該行?

對於實施例

// Reads 500 characters or 1 line, whichever is shorter 
char c[500]; 
fgets(c, 500, pFile); 

比。

// Reads at most 1 character 
char c; 
fgets(&c,1,pFile); 
+0

是的。 我的緩衝區長度是100. 所以我猜它足夠.. – 2010-03-03 16:23:03

+0

數組變量聲明不正確! – t0mm13b 2010-03-03 16:24:20

+0

@JaredPar:酷!你修好了! :P嘿,我在從0降至-1後投票贊成,然後在您糾正之後提高投票率,將其恢復爲零,而不是跳到1 ...是我的瀏覽器還是一個小故障? – t0mm13b 2010-03-03 16:27:38

2

兼用fgets,如果你知道你的行會放入緩衝區或使用fgetc爲更好地控制閱讀

3

這比一個完整的答案評論,但我沒有足夠的點評論。 :)

這裏的函數原型與fgets():

char *fgets(char *restrict s, int n, FILE *restrict stream); 

它會讀取n-1個字節或最多換行或EOF。欲瞭解更多信息,請參閱here

2

使用fgets從讀取線,然後用getc(...)咀嚼換行或結束行繼續閱讀....這裏是永遠讀線的例子...

 
// Reads 500 characters or 1 line, whichever is shorter 
char c[500], chewup; 
while (true){ 
    fgets(c, sizeof(c), pFile); 
    if (!feof(pFile)){ 
     chewup = getc(pFile); // To chew up the newline terminator 
     // Do something with C 
    }else{ 
     break; // End of File reached... 
    } 
} 
16

使用以下程序從文件中逐行獲取。

#include <stdio.h> 
int main (void) 
{ 
    char filename[] = "file.txt"; 
    FILE *file = fopen (filename, "r"); 

    if (file != NULL) { 
    char line [1000]; 
    while(fgets(line,sizeof line,file)!= NULL) /* read a line from a file */ { 
     fprintf(stdout,"%s",line); //print the file contents on stdout. 
    } 

    fclose(file); 
    } 
    else { 
    perror(filename); //print the error message on stderr. 
    } 

    return 0; 
} 
0

錯誤來源:

其實這不是我的錯.. 在這種情況下。 我正在使用strtok函數,並意外修改我的原始我的原始字符串。 因此,儘管印刷我得到的錯誤...

謝謝大家對我的幫助.. :)

-1

可以代替用fgets的的fscanf。由於fgets fscanf用於包含空格的字符,但在使用fscanf時,您可以單獨訪問保存在file.eg中的數據,因此存在具有名稱類別卷的文件。現在聲明一個字符串和兩個整數行。