关于 C 语言的一个文件字节问题

2015 年 3 月 28 日
 HxSeek

小白我在Linux下写的一个读取文件的程序,是把整个文件读入内存的,现在发现了一个不太懂的问题。

代码如下:

include<stdio.h>

include<stdlib.h>

//全局字符串缓存区
char *g_pSourceFile;

int main(int argc, char *argv[])
{

//检查参数个数
if(argc < 2)
{
printf("没有指定文件\n");
return 0;
}

//为脚本创建一个文件指针
FILE * pSourceFile;

if(! (pSourceFile = fopen(argv[1], "rb")))
{
    printf("文件读写错误!\n");
    return 0;
}

//获取文件总长度(字节数)
fseek(pSourceFile, 0, SEEK_END);
int SourceSize = ftell(pSourceFile);
printf("%d\n\n", SourceSize);
fseek(pSourceFile, 0, SEEK_SET);

//创建一个足够大的字符串存入整个文件内容
g_pSourceFile = (char *)malloc(SourceSize);

char currChar;     //当前字符

for(int i=0; i<SourceSize; i++)
{
    currChar = fgetc(pSourceFile);
    printf("%s\n", currChar);
}

return 0;

}

当我创建了一个被读取的文件,里面的内容只有123的时候(不包含回车),SourceSize输出4,包含回车的时候输出5, 请问多出的那个字节,是算哪个的?

3766 次点击
所在节点    程序员
7 条回复
HxSeek
2015 年 3 月 28 日
啊!难道Linux的文件末端即使什么都不输入,都添加一个\n? 如果我按了回车,就是2个\n?
ddaii
2015 年 3 月 28 日
@HxSeek 是你的文本编辑器加的,和 Linux 没有关系。
zhjits
2015 年 3 月 28 日
Linux 上面 \n 用于标识一行的结束,所以文本编辑器会自动在最后一行之后添加一个 \n。
Windows 上面 \n 表示两行之间的分隔,所以最后一行之后不需要 \n。
msg7086
2015 年 3 月 28 日
你自己cat一下看尾巴上有没有换行符嘛
或者ll一下也行啊
ETiV
2015 年 3 月 28 日
如果你装了 vim, 你可以用 xxd 命令来以 hex 编码看看那文件.
miterleo
2015 年 3 月 29 日
可以用:
hexdump -C [文件名]
看一下就知道了,文件尾部被添加了一个0x0a,至于为什么,参见下面连接
http://www.zhihu.com/question/22808787
ashong
2015 年 3 月 29 日
把最后一个字节值打出来看看就知道原因了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/179955

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX