如何使用缓冲区和 lseek 更改文件中的某些字母

How to change some letter in a file with the buffer and lseek

我在使用 lseek 和缓冲区进行分配时遇到了一些问题。 objective 是读取文件并将每个字母 'a' 更改为 '?'。我正在 运行 一些小程序来了解函数和缓冲区的工作原理,但我遇到了一些麻烦.. 假设我的文件 "teste" 中只有 "abcabcabc"。 如果我这样做:

int fd = open("teste", O_RDWR);
char buf[1];
int fptr = lseek(fd, 0, SEEK_SET);
fflush(stdout);
read(fd, buf, 1);
printf("%s\n", buf);

我进入我的控制台 "a",所以第一个字母读起来很好,因为我把指针指向开头。但是如果我在 printf 之前做一个 if 条件,比较 buf 到 'a',比如:

if(buf == 'a') printf("%s\n", buf);

它不起作用,它不打印任何东西,所以它不输入 if 语句。我需要将缓冲区与字母进行比较,以便我可以更改文件的所有 'a' .. 我该怎么做呢?

好的,由于下面的答案,这部分已经解决了,但现在我正在尝试读取所有文件并将每个字符与 'a' 进行比较,制作一个简单的 printf 只是为了看看它是否有效.. 我写了这个:

int fd = open("teste", O_RDWR);
char buf[1];
int fptr = lseek(fd, 1, SEEK_SET);
fflush(stdout);
read(fd, buf, 1);
while(fptr > 0){
  read(fd, buf, 1);
  if(buf[0] == 'a'){
    printf("%s\n",buf);
  }
  fflush(stdout);
  fptr=lseek(fd, (off_t)(1), SEEK_CUR);
}
close(fd);

但它现在可以工作了。它只打印一个'a',然后不关闭也不做任何事情。它就像一个无限循环,但没有进入 if 语句。怎么了?

  1. printf("%s\n", buf);UB%s 想要一个 NULL 终止字符串。 Use printf("%c\n", buf[0]);
  2. if(buf == 'a') 必须是 if(buf[0] == 'a')。您正在将 buf 的地址与 'a' 字符进行比较,但您想比较 buf 数组的第一个(唯一)单元格的内容。

buf 是一个包含地址的指针。 所以条件

if(buf=='a')

变成 false 并且不进入 if 块。
尝试使用

if(*buf=='a')if(buf[0]=='a')