我试着用C语言在一个文本文件中的任意位置写东西.


#include <stdio.h>

void write_in_file(FILE *file, char *str, fpos_t *pos){
    fsetpos(file, pos);
    for(int i=0; str[i] != '\0'; ++i){
       fputc(str[i],file);
            }
}

int main(){

    char *str = "Hola123 Mundo\n";
    FILE *file = fopen("database/file_1.txt", "w");

    fpos_t pos = 1;
    write_in_file(file, str, &pos);

    fclose(file);
    return 0;
}

文本文件中有以前的信息.我先用pos = 0"Hola123 Mundo\n",然后用pos = 1重写.我希望输出文件是

HHola123 Mundo

但是一个GET

'\0'Hola123 Mundo

我知道第一个字节是空字符,因为在十六进制编辑器中,二进制是00.

我的直觉是,当以"w"模式打开时,重写整个文件,因此跳过第一个位置会导致跳过00字节.然后我try 了"w+"模式,但出现了同样的错误.

推荐答案

首先: fpos_t是不透明的.使用fpos_t的唯一正确方法是使用先前通过fgetpos()获得的值.如果要将文件设置为固定偏移量,请改用fseek():

void write_in_file(FILE *file, char *str, long pos) {
    fseek(file, pos, SEEK_SET);
    for (int i = 0; str[i] != '\0'; ++i) {
        fputc(str[i], file);
    }
}

此外,你可以使用fputs()来代替循环:

void write_in_file(FILE *file, char *str, long pos) {
    fseek(file, pos, SEEK_SET);
    fputs(str, file);
}

为了回答最初的问题,您从未在打开文件后以偏移量0向文件写入字符串,并且以"w"模式打开文件会将文件截断为0长度,从而删除其中已有的任何数据.当您以偏移量1写入空文件时,第一个字节是不确定的,在您的示例中被设置为0.

如果你做了:

write_in_file(file, str, 0);
write_in_file(file, str, 1);

或者(假设您的文件已经以H开头):

FILE *file = fopen("database/file_1.txt", "r+");

而不是仅仅:

// fpos_t pos = 1;
// write_in_file(file, str, &pos);
write_in_file(file, str, 1);

以及:

FILE *file = fopen("database/file_1.txt", "w");

相应地,那么您的文件将包含:

HHola123 Mundo

C++相关问答推荐

初始化char数组-用于初始化数组的字符串是否除了存储数组的位置之外单独存储在内存中

球体—立方体重叠:无、部分或全部?

Tiva TM4C123GXL的I2C通信

Malloc(sizeof(char[Length]))是否不正确?

ZED for SDL上的C语言服务器

致命:ThreadSaniizer:在Linux内核6.6+上运行时意外的内存映射

Clang警告称,`ffi_type`与`sizeof`不兼容

在为hashmap创建加载器时,我的存储桶指向它自己

实现简单字典时C语言中的段错误

用C++从外部ELF符号读取值

如何仅使用软件重新初始化STM32微控制器中的USB枚举?

获取前2个连续1比特的索引的有效方法

当用C打印过多的';\n';时输出不正确

为什么孤儿进程在 Linux 中没有被 PID 1 采用,就像我读过的一本书中声称的那样?

macos/arm64 上地址空间不使用第一位吗?

如何为avr atmega32微控制器构建C代码,通过光电二极管捕获光强度并通过串行通信传输数据

尽管将其标记为易失性,但 gcc 是否优化了我的等待代码?

通过修改c中的合并排序对数组的偶数索引进行排序

是否可以在多字 C 类型中的任何位置混合存储和类型限定符?

比 * 更快的乘法