Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Linux文件操作测试程序不';I don’我没有表现得像预期的那样_C_Linux_System Calls - Fatal编程技术网

C Linux文件操作测试程序不';I don’我没有表现得像预期的那样

C Linux文件操作测试程序不';I don’我没有表现得像预期的那样,c,linux,system-calls,C,Linux,System Calls,有人能给我解释一下为什么打印以下测试程序: abcde 福吉 杰克利 m 谎言 m 谎言 而不是: abcde 福吉 杰克利 姆克利 姆克利 该计划是: #include <unistd.h> #include <fcntl.h> #include <stdio.h> char buffer[16]; void main() { int fd=open("bb",O_RDONLY); int i; for(i=5;i>0;i--)

有人能给我解释一下为什么打印以下测试程序:

abcde

福吉

杰克利

m

谎言

m

谎言

而不是:

abcde

福吉

杰克利

姆克利

姆克利

该计划是:

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
char buffer[16];
void main()
{
    int fd=open("bb",O_RDONLY);
    int i;
    for(i=5;i>0;i--)
    {
        read(fd,buffer,i);
        printf("%s\n",buffer);
    }
}
#包括
#包括
#包括
字符缓冲区[16];
void main()
{
int fd=打开(“bb”,仅限Ordu);
int i;
对于(i=5;i>0;i--)
{
读取(fd,缓冲器,i);
printf(“%s\n”,缓冲区);
}
}
文件bb包含以下序列:abcdefghijklm

  • 第一次迭代读取“abcde”,因此
    buffer
    包含“abcde\0\0\0\0\0\0\0\0\0”和
    fd
    指向“f”
  • 第二次迭代读取“fghi”,因此
    buffer
    包含“fghie\0\0\0\0\0\0\0\0”和
    fd
    指向“j”
  • 第三次迭代读取“jkl”,因此
    buffer
    包含“jklie\0\0\0\0\0\0\0\0”和
    fd
    指向“m”
  • 第四次迭代读取“m\n”,因此
    buffer
    包含“m\nlie\0\0\0\0\0\0\0\0\0”并且
    fd
    位于文件末尾
  • 第五次迭代不读取任何内容,因此
    缓冲区中没有任何更改
  • 请注意,代码依赖于全局变量
    buffer
    被初始化为零

  • 第一次迭代读取“abcde”,因此
    buffer
    包含“abcde\0\0\0\0\0\0\0\0\0”和
    fd
    指向“f”
  • 第二次迭代读取“fghi”,因此
    buffer
    包含“fghie\0\0\0\0\0\0\0\0”和
    fd
    指向“j”
  • 第三次迭代读取“jkl”,因此
    buffer
    包含“jklie\0\0\0\0\0\0\0\0”和
    fd
    指向“m”
  • 第四次迭代读取“m\n”,因此
    buffer
    包含“m\nlie\0\0\0\0\0\0\0\0\0”并且
    fd
    位于文件末尾
  • 第五次迭代不读取任何内容,因此
    缓冲区中没有任何更改

  • 请注意,代码依赖于全局变量
    buffer
    被初始化为零。

    您的缓冲区不是以null结尾的。在每次调用
    fread
    之前,调用
    memset
    将其初始化为全零。检查
    open
    fread
    中的返回代码也是一个好主意。
    read()
    函数不为null并终止其输入。如果真是这样,那将是一场灾难。你知道它读了多少字节。不要打印更多!可能
    bb
    文件末尾有一个换行符,当
    i==2
    时,该换行符将被读入缓冲区。在
    read
    add之后:
    buffer[i]='\0'@DanielSchepler,也许这就是重点。Vi说bb文件有14个字符长,但应该是13个字符(只有字母a-m),在“catbb”命令之后,promt出现在下一行。显然你是对的,但不知何故,我不知道为什么vi会在每次保存文件时自动将这个“\n”字符放在最前面。如何删除它?缓冲区不是以null结尾的。在每次调用
    fread
    之前,调用
    memset
    将其初始化为全零。检查
    open
    fread
    中的返回代码也是一个好主意。
    read()
    函数不为null并终止其输入。如果真是这样,那将是一场灾难。你知道它读了多少字节。不要打印更多!可能
    bb
    文件末尾有一个换行符,当
    i==2
    时,该换行符将被读入缓冲区。在
    read
    add之后:
    buffer[i]='\0'@DanielSchepler,也许这就是重点。Vi说bb文件有14个字符长,但应该是13个字符(只有字母a-m),在“catbb”命令之后,promt出现在下一行。显然你是对的,但不知何故,我不知道为什么vi会在每次保存文件时自动将这个“\n”字符放在最前面。如何删除它?Lunix是否希望文本文件以换行结束?我见过编译器抱怨源文件没有,但我不确定这是否只是一个惯例或其他什么是的,这就是重点。非常感谢。但是现在我不明白为什么每次我保存文件并退出vi编辑器时,“\n”都会弹出?在保存前,我不按Enter,也不键入-N。我认为对于该抱怨的粗略理由是考虑文本文件的“语法”:<代码> Trtext Fix:= Lead *;行:=(可打印*非空格|可打印|空)'\n'
    因此,结尾没有换行的非空文件充其量是一个不完整的文本文件。(另外,还有一个实用的解释,即如果
    textfile
    末尾缺少换行符,
    cat textfile
    会弄乱shell提示符的格式。)换句话说,借用有关Pascal和C之间区别的术语:
    \n
    被视为行终止符而不是行分隔符。Lunix是否希望文本文件以换行符结尾?我见过编译器抱怨源文件没有,但我不确定这是否只是一个惯例或其他什么是的,这就是重点。非常感谢。但是现在我不明白为什么每次我保存文件并退出vi编辑器时,“\n”都会弹出?在保存前,我不按Enter,也不键入-N。我认为对于该抱怨的粗略理由是考虑文本文件的“语法”:<代码> Trtext Fix:= Lead *;行:=(可打印*非空格|可打印|空)'\n'
    因此,结尾没有换行的非空文件充其量是一个不完整的文本文件。(另外,还有一种实用的解释,即如果
    textfile
    末尾缺少换行符,
    cat textfile
    会弄乱shell提示符的格式。)换句话说,借用有关Pascal和C之间区别的术语:
    \n
    被视为行终止符而不是行分隔符。