我正在我的大学从事C语言工作,我正在开始使用缓冲区和这个功能,因此我可能会表现出对我缺乏知识的厌恶。 我必须使用lseek(),write()和read()来完成这个项目。我想读一个文件,每个字母都是' a'我发现我会把它改成'?'。到目前为止我的代码是:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
int main () {
int fd = open("problema4file", O_RDWR);
int fptr = lseek(fd, (off_t)(-1), SEEK_END);
char buffer;
while(fptr!=-1){
read(fd, &buffer, 1);
char changeTo = '?';
if(buffer == 'a'){
write(fd, &changeTo,1);
}
fptr=lseek(fd, (off_t)(-2), SEEK_CUR);
}
close(fd);
}
但这改变了第一个&#39; a&#39; (最后,因为我从头开始)而不是更多。它停止变化。哦,它并没有改变&#39; a&#39;,之后更改了字母,但这与缓冲运动有关吗?我可能会稍后考虑一下......我只是想知道为什么它没有读取所有文件并改变所有内容,它在第一次发现时停止。
答案 0 :(得分:0)
您读取一个字节然后写入一个字节而不重新定位文件中的偏移量。然后你向后寻找2个位置。
写下你在一张纸上做的事情,以了解错误。
P.S。最后一行 - 你应该从现在开始编写所有内容,直到你不再编写代码为止;)
you seek to EOF - 1, you're before the last byte in the file.
you read a byte, you're now at EOF.
Then you write a byte (you've extended the file by one), you're positioned again @ EOF.
you now seek backwards 2 bytes, which puts you back to where you began.