使用 lseek() read() 和 write() 处理文件时遇到问题
Trouble working with file using lseek() read() and write()
我在我的大学里从事 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);
}
但这改变了第一个 'a'(最后一个,因为我从末尾开始),仅此而已。它停止变化。哦,它不会改变 'a',改变后面的字母,但这与缓冲区移动有关,对吗?我可能稍后会考虑。我只是想知道为什么它不读取所有文件并更改所有内容,它在第一个发现时停止。
您读取一个字节然后写入一个字节,而没有重新定位文件中的偏移量。然后你向后寻找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.
我在我的大学里从事 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);
}
但这改变了第一个 'a'(最后一个,因为我从末尾开始),仅此而已。它停止变化。哦,它不会改变 'a',改变后面的字母,但这与缓冲区移动有关,对吗?我可能稍后会考虑。我只是想知道为什么它不读取所有文件并更改所有内容,它在第一个发现时停止。
您读取一个字节然后写入一个字节,而没有重新定位文件中的偏移量。然后你向后寻找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.