如何使用缓冲区和 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 语句。怎么了?
printf("%s\n", buf);
是
UB。 %s
想要一个
NULL
终止字符串。 Use printf("%c\n", buf[0])
;
if(buf == 'a')
必须是 if(buf[0] == 'a')
。您正在将 buf
的地址与 'a'
字符进行比较,但您想比较 buf
数组的第一个(唯一)单元格的内容。
buf
是一个包含地址的指针。
所以条件
if(buf=='a')
变成 false
并且不进入 if
块。
尝试使用
if(*buf=='a')
或 if(buf[0]=='a')
我在使用 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 语句。怎么了?
printf("%s\n", buf);
是 UB。%s
想要一个NULL
终止字符串。Use printf("%c\n", buf[0])
;if(buf == 'a')
必须是if(buf[0] == 'a')
。您正在将buf
的地址与'a'
字符进行比较,但您想比较buf
数组的第一个(唯一)单元格的内容。
buf
是一个包含地址的指针。
所以条件
if(buf=='a')
变成 false
并且不进入 if
块。
尝试使用
if(*buf=='a')
或 if(buf[0]=='a')