怎麼能指望你在每行的字符或數字的數量?有沒有像EOF那樣更像線的末端?查找行大小
查找行大小
回答
您可以通過在該行的每個字符迭代,不斷遞增的計數器,直到最後的行('\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;
}
關於逐行讀取文件中的行,看看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
但因爲你不太可能與僅使用回車,找換行應該是精細的表示來工作。
\n
是C中的換行字符在其它語言,如C#,則可能會使用類似C#的Environment.EndLine
來克服平臺困難。
如果您已經知道您的字符串是一行(我們稱之爲行),請使用strlen(line)
來獲取其中的字符數。如果以'\n'
結尾,則減1。
如果字符串中有新的行字符,則需要將它拆分爲新行字符,然後在每個子字符串上調用strlen()
。
他沒有字符串,他有一個文件。 – danben 2010-01-26 02:34:40
如果以文本模式打開文件,即在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 */
- 1. 查找大小
- 2. 查找組大小
- 3. 查找DWORD大小
- 4. 如何找到sql查詢行大小
- 5. 查找緩存塊大小
- 6. 查找大小在MATLAB
- 7. Hadoop fs查找塊大小?
- 8. 查找NewArrayExpression的大小
- 9. 查找大小遞歸
- 10. 查找矢量的大小
- 11. 查找文件大小位
- 12. 查找指針的大小
- 13. 找出查找表的大小C
- 14. Hive查詢快速查找表大小(行數)
- 15. SQL:查找最大行數
- 16. 查找最小和最大日期SQL
- 17. 查找的大小和排列
- 18. 在24小時內查找最大值
- 19. 查找最大,最小和中間值
- 20. 在Unix中查找大小的文件
- 21. 查找2D矢量的大小
- 22. 查找git倉庫的大小
- 23. 查找組件 - 緩存大小
- 24. 查找Linux安裝的總大小
- 25. 查找最大值/最小值
- 26. 如何查找存儲庫的大小
- 27. 查找大小,以填補區域
- 28. 查找double *數組的大小C++
- 29. 在MongoDB中查找遊標大小
- 30. 查找目錄的大小在UNIX
你並不需要逐個字符地獲取新行的索引。您可以使用strcspn()來查找'\ n'的索引。 (請參閱http://stackoverflow.com/questions/4824/string-indexof-function-in-c) – David 2010-01-26 02:32:20
strcspn()和strspn()不從文件讀取。要使用它們,您必須將整行讀入一個字符串,然後重新遍歷它以找到'\ n'字符。這效率較低。當然,這取決於MRP如何做他的文件IO代碼。 – Sam 2010-01-26 02:34:48
是的,這段代碼的確有幫助,但我不得不改變一些事情。但我更好地瞭解這是如何工作的。謝謝 – MRP 2010-01-26 03:22:51