read() 没有读到我刚刚写的内容

问题描述 投票:0回答:1

我正在学习用 C 处理文件。现在我尝试正确使用

read()
write()
。所以我写了以下代码:

#include <stdio.h>
#include <fcntl.h>
int main(){
    [...]
    write(fd, "Hallo", 5);
    printf("Value before:");
    for(int i = 0; i < 5; i++){
        printf("%c", buf[i]);
    }
    printf("\n");
    reading = read(fd, buf, 5);
    printf("%d\n", reading);
    printf("Value after:");
    for(int i = 0; i < 5; i++){
        printf("%c", buf[i]);
    }
    [...]
}

程序应该打开给定的文件,在其中写入“Hallo”并读取文件中的文本。作为输出,应该有一个文本“之前的值:”与空缓冲区内部(所以我猜什么都没有?),然后是读取的字符数(读取的值),最后一行是“之后的值:”和后面写着“Hallo”。

我的问题:我从这段代码中得到的唯一输出是写有“之前的值:”和“之后的值:”的行,并且在这两行之间输出了读取的值。但每次读取的值都是0。而应该位于“Value after”后面的文本(参见第二个 for 循环)不存在。当我输出文件的写入内容(通过使用 cat)时,会输出“Hallo”。 结论是问题一定出在 read() 函数上,因此它无法读取文件。但我不知道为什么。我认为语法是正确的。 我希望你能帮助我。

c file-descriptor
1个回答
0
投票

POSIX 文件函数保留了“当前文件偏移量”的概念。您可以使用

lseek()
函数查询和修改该偏移量。当您读取或写入数据时,当前偏移量会自动移动到您刚刚读取或写入的数据的末尾。

所以,在你写完“Hallo”之后,当前的偏移量是在“Hallo”的末尾。如果您此时尝试读取数据,您当然不会读取任何内容,因为当前偏移量已经位于文件末尾。

要纠正此问题,您必须关闭并重新打开文件,或使用

lseek()
查找文件的开头,然后下一个
read()
将显示“Hallo”。

© www.soinside.com 2019 - 2024. All rights reserved.