使用C系统调用修改文件

时间:2015-05-09 12:48:23

标签: c system-calls

我想使用C系统调用修改文件中的特定字节。我对open()和read()以及write()系统调用有一些了解。

假设我想修改文件中的第1024个字节,文件有2048个字节。所以我可以使用read()读出1024字节到字符数组并更改所需的字节。

现在当我将修改后的字符数组写回文件时,文件的其余部分是否保持相同?学习材料在这一点上并不清楚。请帮我理解这个。

1 个答案:

答案 0 :(得分:1)

您可以使用<stdio.h>

中的标准流进行移植
#include <stdio.h>
#include <ctype.h>

/* uppercase letter at offset 1024 */
FILE *fp = fopen("filename", "r+b");
if (fp) {
    fseek(fp, 1024L, SEEK_SET);
    int c = getc(fp);
    if (c != EOF) {
        fseek(fp, 1024L, SEEK_SET);
        putc(toupper((unsigned char)c), fp);
    }
    fclose(fp);
}

如果您可以访问Posix API,则可以直接使用系统调用,但请注意write()可能会在某些情况下提前返回。它只是写一个字节应该不是问题,但如果你写了更改大块的文件,可能会成为一个问题。流接口更易于使用。这是Posix代码:

#include <unistd.h>
#include <ctype.h>

/* uppercase letter at offset 1024 */
unsigned char uc;
int hd = open("filename", O_RDWR | O_BINARY);
if (hd >= 0) {
    lseek(hd, 1024L, SEEK_SET);
    if (read(hd, &uc, 1) == 1) {
        lseek(hd, -1L, SEEK_CUR);
        uc = toupper(uc);
        write(hd, &uc, 1);
    }
    close(hd);
}