【发布时间】:2016-11-08 09:11:27
【问题描述】:
当我尝试使用 fread() 将文件复制到字符串中时,我从文件中获取了与新行数完全相同的额外字符。 这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#define LEN 5000000
int main()
{
char *in = (char*) malloc(LEN);
FILE *f=fopen("in.txt","r");
fread(in,5000000,1,f);
printf("%ld\n", ftell(f));
in[ftell(f)]=0;
int l;
for(l=0;true;l++)
{
if(in[l]<10)
break;
printf("%d ",in[l]);
}
printf("\n");
}
这个程序的输入是:
1
2
<newline>
输入链接:https://paste.fedoraproject.org/388281/46780193/
对于输出,我正在打印读取字符的 ASCII 值:
6
49 10 50 10 13 10
如果输入是:
1
2
3
<newline>
输入链接:https://paste.fedoraproject.org/388280/
那么输出是:
9
49 10 50 10 51 10 51 13 10
我看到了其他一些测试用例。在每个测试用例中,额外的字符数总是换行数。
我有几个问题:
-为什么图案是这样的?
- 这与新行在 Windows 中占用 2 个字节这一事实有什么关系?
-如何摆脱那些多余的字符?
我搜索了类似的问题,但没有找到答案。请有人解释一下吗?
【问题讨论】:
-
为什么?因为这正是文件中的内容。换行符 (
\n) 需要在那里表示换行。有很多方法可以摆脱换行符。最好的方法取决于您要达到的目标。参见例如Removing trailing newline character from fgets() input -
请显示您文件的确切内容。
-
另外,您为什么不使用您专门定义的
LEN,而不是在fread()call 中输入号码? -
DOS换行符是CR+LF
-
fread不用于阅读文本,fgets是更好的选择。