我正在学习用 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() 函数上,因此它无法读取文件。但我不知道为什么。我认为语法是正确的。 我希望你能帮助我。
POSIX 文件函数保留了“当前文件偏移量”的概念。您可以使用
lseek()
函数查询和修改该偏移量。当您读取或写入数据时,当前偏移量会自动移动到您刚刚读取或写入的数据的末尾。
所以,在你写完“Hallo”之后,当前的偏移量是在“Hallo”的末尾。如果您此时尝试读取数据,您当然不会读取任何内容,因为当前偏移量已经位于文件末尾。
要纠正此问题,您必须关闭并重新打开文件,或使用
lseek()
查找文件的开头,然后下一个 read()
将显示“Hallo”。