gpt4 book ai didi

C、unix 和用 write()、open() 和 lseek() 覆盖一个字符

转载 作者:太空狗 更新时间:2023-10-29 15:30:07 25 4
gpt4 key购买 nike

我需要将文本文件中的 a 字符替换为“?”。它没有按预期工作。

该文件包含内容“abc”(不带引号),我必须使用 unix 系统调用:lseek()、open() 和 write()。我不能使用标准的 C 文件 I/O 函数。

计划最终将其扩展为更通用的“查找和替换”实用程序。

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main(){

int file = open("data", O_RDWR); //open file with contents 'abc'
lseek(file,0,0); //positions at first char at beginnging of file.
char buffer;
read(file,&buffer, sizeof(buffer));
printf("%c\n", buffer); // text file containing 'abc', it prints 'a'.

if (buffer == 'a'){
char copy = '?';
write(file,&copy,1); //text file containing 'abc' puts '?' were 'b' is.
}

close(file);
}

文件“data”包含abc,我想将a替换为?并设为?bc 但我收到了 a?c

read() 正在读取正确的字符,但 write() 正在写入下一个字符。为什么是这样?

在谷歌上搜索了几个小时。

谢谢

最佳答案

答案实际上以某种方式嵌入到您自己的代码中。

不需要在 open 之后立即执行的 lseek 调用,因为当您第一次打开 文件时,当前查找偏移量为零。

在每次成功的readwrite 操作之后,寻道偏移向前移动读取/写入的字节数。 (如果您将 O_APPEND 添加到您的 open 中,搜索偏移量也会在每次写入之前移动到当前文件末尾,但是这在这一点上不相关。)

自从您成功读取 一个字节后,您的查找偏移量从 0 移动到 1。如果您想将其放回 0,您必须手动执行此操作。

(当然,您还应该检查每个操作是否真的成功,但我假设您在这里为了简洁而忽略了它。)

关于C、unix 和用 write()、open() 和 lseek() 覆盖一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10135755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com