V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
HxSeek
V2EX  ›  程序员

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

  •  
  •   HxSeek · 2015-03-28 16:50:49 +08:00 · 3091 次点击
    这是一个创建于 3517 天前的主题,其中的信息可能已经有所发展或是发生改变。

    小白我在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, 请问多出的那个字节,是算哪个的?

    7 条回复    2015-03-29 00:48:50 +08:00
    HxSeek
        1
    HxSeek  
    OP
       2015-03-28 16:56:26 +08:00
    啊!难道Linux的文件末端即使什么都不输入,都添加一个\n? 如果我按了回车,就是2个\n?
    ddaii
        2
    ddaii  
       2015-03-28 17:15:53 +08:00
    @HxSeek 是你的文本编辑器加的,和 Linux 没有关系。
    zhjits
        3
    zhjits  
       2015-03-28 19:07:48 +08:00
    Linux 上面 \n 用于标识一行的结束,所以文本编辑器会自动在最后一行之后添加一个 \n。
    Windows 上面 \n 表示两行之间的分隔,所以最后一行之后不需要 \n。
    msg7086
        4
    msg7086  
       2015-03-28 22:28:43 +08:00 via iPhone
    你自己cat一下看尾巴上有没有换行符嘛
    或者ll一下也行啊
    ETiV
        5
    ETiV  
       2015-03-28 23:34:50 +08:00
    如果你装了 vim, 你可以用 xxd 命令来以 hex 编码看看那文件.
    miterleo
        6
    miterleo  
       2015-03-29 00:35:00 +08:00
    可以用:
    hexdump -C [文件名]
    看一下就知道了,文件尾部被添加了一个0x0a,至于为什么,参见下面连接
    http://www.zhihu.com/question/22808787
    ashong
        7
    ashong  
       2015-03-29 00:48:50 +08:00 via iPhone
    把最后一个字节值打出来看看就知道原因了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1058 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 19:42 · PVG 03:42 · LAX 11:42 · JFK 14:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.