使用 C 系统调用修改文件
Modifying a file using C System Calls
我想使用 C 系统调用修改文件中的特定字节。我对 open() 和 read() 以及 write() 系统调用有一些了解。
假设我想修改文件中的第 1024 个字节,而文件有 2048 个字节。所以我可以使用 read() 将 1024 个字节读出到字符数组并更改所需的字节。
现在,当我将修改后的字符数组写回文件时,文件的其余部分是否保持不变?学习资料在这方面不清楚。请帮助我理解这一点。
您可以使用来自 <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()
在某些情况下可能会 return 提前。仅写入单个字节应该不是问题,但如果您写入更改大块文件,则可能会成为问题。流接口更易于使用。这是 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);
}
我想使用 C 系统调用修改文件中的特定字节。我对 open() 和 read() 以及 write() 系统调用有一些了解。
假设我想修改文件中的第 1024 个字节,而文件有 2048 个字节。所以我可以使用 read() 将 1024 个字节读出到字符数组并更改所需的字节。
现在,当我将修改后的字符数组写回文件时,文件的其余部分是否保持不变?学习资料在这方面不清楚。请帮助我理解这一点。
您可以使用来自 <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()
在某些情况下可能会 return 提前。仅写入单个字节应该不是问题,但如果您写入更改大块文件,则可能会成为问题。流接口更易于使用。这是 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);
}