【问题标题】:Changing one byte in a file in C在 C 中更改文件中的一个字节
【发布时间】:2009-05-10 11:14:39
【问题描述】:

我有一个打开并准备好的文件流。

如何访问和更改流中的单个字节,以便将更改反映在文件上?

有什么建议吗?

【问题讨论】:

    标签: c


    【解决方案1】:
    #include "stdio.h"
    
    int main(void)
    {
        FILE* f = fopen("so-data.dat", "r+b"); // Error checking omitted
        fseek(f, 5, SEEK_SET);
        fwrite("x", 1, 1, f);
        fclose(f);
    }
    

    【讨论】:

    • A (f != NULL) 是必需的。 fclose(NULL) 调用 UB。
    • fwrite("x", 1, 1, f);这不是写字符串“x”的地址的第一个字节吗?
    • 不,它没有 - 忽略我:-)
    • r+权限不是不允许写吗?
    • 请注意,跳转到 text 模式文件中的计算位置是实现定义的。对于文本和二进制模式不同的平台(即,除了 Unix 之外的几乎所有东西),您需要处理换行符可以是多个字节(或以其他方式有趣)的事实。我不知道这对 Yuval A 是否重要。
    【解决方案2】:
    FILE* fileHandle = fopen("filename", "r+b"); // r+ if you need char mode
    fseek(fileHandle, position_of_byte, SEEK_SET);
    fwrite("R" /* the value to replace with */, 1, 1, fileHandle);
    

    【讨论】:

    • "rw" 截断文件。你需要“rb”。
    • sizeof(char) == 1,根据定义。
    • @Greg,在 POSIX 系统(包括 Linux)上,“r+”可以,“b”被忽略。遗憾的是,在 Windows 上,二进制模式必须包含“b”。
    【解决方案3】:
    #include <stdio.h> /* standard header, use the angle brackets */
    
    int main(void)
    {
        char somechar = 'x'; /* one-byte data */
        FILE* fp = fopen("so-data.txt", "r+");
        if (fp) {
          fseek(fp, 5, SEEK_SET);
          fwrite(&somechar, 1, 1, fp);
          fclose(fp);
        }
        return 0; /* if you are on non-C99 systems */
    }
    

    【讨论】:

      猜你喜欢
      • 2018-11-29
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 2016-02-28
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多