2010-01-26 91 views
5

怎麼能指望你在每行的字符或數字的數量?有沒有像EOF那樣更像線的末端?查找行大小

回答

5

您可以通過在該行的每個字符迭代,不斷遞增的計數器,直到最後的行('\n')遇到。確保打開文本模式("r"),而不是二進制模式("rb")文件。否則,流不會自動將不同平臺的行結束序列轉換爲'\n'字符。

下面是一個例子:

int charcount(FILE *const fin) 
{ 
    int c, count; 

    count = 0; 
    for(;;) 
    { 
     c = fgetc(fin); 
     if(c == EOF || c == '\n') 
      break; 
     ++count; 
    } 

    return count; 
} 

下面是一個例子程序來測試上述功能:

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    FILE *fin; 

    fin = fopen("test.txt", "r"); 
    if(fin == NULL) 
     return 1; 

    printf("Character count: %d.\n", charcount(fin)); 

    fclose(fin); 
    return 0; 
} 
+0

你並不需要逐個字符地獲取新行的索引。您可以使用strcspn()來查找'\ n'的索引。 (請參閱http://stackoverflow.com/questions/4824/string-indexof-function-in-c) – David 2010-01-26 02:32:20

+0

strcspn()和strspn()不從文件讀取。要使用它們,您必須將整行讀入一個字符串,然後重新遍歷它以找到'\ n'字符。這效率較低。當然,這取決於MRP如何做他的文件IO代碼。 – Sam 2010-01-26 02:34:48

+0

是的,這段代碼的確有幫助,但我不得不改變一些事情。但我更好地瞭解這是如何工作的。謝謝 – MRP 2010-01-26 03:22:51

2

關於逐行讀取文件中的行,看看fgets

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

的與fgets()函數須從流中讀出字節 入指向的數組 由s,直到n-1個字節被讀入,或 被讀出並傳送到 S,或遇到的文件結束條件是 。該字符串是 以空字節結尾。

這裏唯一的問題可能是如果您不能保證文件中的最大行大小。如果是這種情況,則可以迭代字符,直到看到換行。

關於行末:

簡短的回答:\n是換行字符(也稱爲換行)。

朗的答案,從維基百科:

系統基於ASCII或(十進制行 飼料的0x0A,10)兼容的 字符集要麼LF或CR (回車,0X0D,13十進制) 單獨,或CR接着LF (CR + LF,0X0D的0x0A);請參閱下面的 歷史原因CR + LF 約定。這些字符在打印機命令基於 :線料 表明,紙 一個行應送出打印機,和一個 回車表明 打印機滑架應該返回到開始 當前行的。

* LF: Multics, Unix and Unix-like systems (GNU/Linux, AIX, Xenix, Mac OS X, FreeBSD, etc.), BeOS, Amiga, RISC OS, and others 
* CR+LF: DEC RT-11 and most other early non-Unix, non-IBM OSes, CP/M, MP/M, DOS, OS/2, Microsoft Windows, Symbian OS 
* CR: Commodore 8-bit machines, Apple II family, Mac OS up to version 9 and OS-9 

但因爲你不太可能與僅使用回車,找換行應該是精細的表示來工作。

+0

洙可以使一個循環,直到炭= \ n – MRP 2010-01-26 02:24:06

+0

右[15個字符] – danben 2010-01-26 02:25:27

+0

FILE *中; in = fopen(「numbers.txt」,「r」); if(in!= NULL) \t { 是否使用fget直到\ n? – MRP 2010-01-26 02:26:14

1

\n是C中的換行字符在其它語言,如C#,則可能會使用類似C#的Environment.EndLine來克服平臺困難。

如果您已經知道您的字符串是一行(我們稱之爲行),請使用strlen(line)來獲取其中的字符數。如果以'\n'結尾,則減1。

如果字符串中有新的行字符,則需要將它拆分爲新行字符,然後在每個子字符串上調用strlen()

+0

他沒有字符串,他有一個文件。 – danben 2010-01-26 02:34:40

1

如果以文本模式打開文件,即在fopen()的第二個參數中沒有b,則可以逐個讀取字符,直到找到'\n'以確定行大小。底層系統應該負責將行結束符轉換爲一個字符'\n'。在某些系統上,文本文件的最後一行可能不會以'\n'結尾,所以這是一種特殊情況。

僞代碼:

count := 0 
c := next() 
while c != EOF and c != '\n'" 
    count := count + 1 

上述將計數在給定的行中的字符數。 next()是一個函數,用於返回文件中的下一個字符。

備選地,可以使用fgets()用緩衝:

char buf[SIZE]; 
count = 0; 
while (fgets(buf, sizeof buf, fp) != NULL) { 
    /* see if the string represented by buf has a '\n' in it, 
     if yes, add the index of that '\n' to count, and that's 
     the number of characters on that line, which you can 
     return to the caller. If not, add sizeof buf - 1 to count */ 
} 
/* If count is non-zero here, the last line ended without a newline */ 
+0

你可以解釋SIZE ..我不知道如果這是一個Var或一個命令C使用。 – MRP 2010-01-26 02:51:17

+0

@MRP:'SIZE'是一個方便的正整數值,可以是預處理器宏或幻數。我沒有給你一個完整的代碼,因爲我不確定這是否是一個家庭作業問題。 :-) – 2010-01-26 03:03:32

+0

那麼如果SIZE是一個數字,我把..我需要它不會工作,然後因爲我不知道大小.. – MRP 2010-01-26 03:06:14