-1

我在我的大学里研究 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',改变之后的字母,但这与缓冲运动有关,对吧?我以后可能会考虑..我只是想知道为什么这不会读取所有文件并更改所有内容,它会在第一次发现时停止。

4

1 回答 1

0

您读取一个字节,然后写入一个字节,而无需重新定位文件中的偏移量。然后你向后寻找2个位置。

在一张纸上写下你正在做的事情,以了解哪里出了问题。

PS 最后一行 - 从现在开始,您应该对您编写的所有内容都这样做,直到您不再编写代码;)

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.  
于 2016-03-23T20:24:03.317 回答