0

我在使用 lseek 和缓冲区进行分配时遇到了一些麻烦。目标是读取文件并将每个字母“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语句。怎么了?

4

2 回答 2

2
  1. printf("%s\n", buf);UB%s想要一个 NULL终止的字符串。Use printf("%c\n", buf[0]);
  2. if(buf == 'a')必须是if(buf[0] == 'a')。您正在比较 char 的地址,buf'a'您想比较buf数组的第一个(唯一)单元格的内容。
于 2016-03-24T16:11:41.953 回答
1

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

if(buf=='a')

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

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

于 2016-03-24T16:14:14.177 回答