怎么能指望你在每行的字符或数字的数量?有没有像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