1) 我有一个结构,需要使用 write() 系统调用而不是 fwrite() 将其写入文件。这可能吗?
2)将结构写入文件后,我需要读取另一个文件,并将其写入现在写入结构的文件末尾。
任何帮助,将不胜感激。
1) 我有一个结构,需要使用 write() 系统调用而不是 fwrite() 将其写入文件。这可能吗?
2)将结构写入文件后,我需要读取另一个文件,并将其写入现在写入结构的文件末尾。
任何帮助,将不胜感激。
这会将您的结构写入文件。
int fd = open(file, O_WRONLY);
struct my_struct a;
write(output, &a, sizeof(struct my_struct));
对于另一个文件,只需打开它,循环读取它的内容,然后将其写入前一个文件。
int fd2 = open(otherfile, O_RDONLY);
int readret;
char buf[4096];
while ((readret = read(fd2, buf, sizeof(buf) != 0) {
write(fd, buf, readret);
}
请记住测试每个写入/读取结果(如评论中所述),并处理这些错误。
如果您正在谈论用二进制编写结构,那么是的。K&R 中描述的函数用法是:
int n_written = write( int fd, char *buf, int n );
所以你会有:
struct mystruct s;
write( fd, (char*)&s, sizeof(s) );
如果您希望以文本形式序列化结构,您将需要使用sprintf
或类似方法来构造格式化字符串,然后将其写入文件。
现在,您想读入另一个文件并将其写入您刚刚将结构转储到的文件中。只需使用read
andwrite
一次移动数据块。一个合理的做法是移动磁盘扇区大小的倍数(传统上为 512 字节,但现在您可能希望使用 4096 之类的东西)。
假设你已经声明
struct somestruct_st mydata;
你可以用
ssize_t cnt = write (yourfd, &mydata, sizeof(mydata));
if (cnt != sizeof(mydata)) {
// handle that case
}
write 和 fwrite 的工作方式相同,唯一的区别是 write 使用文件解列符 (fd),其中 fwrite 使用 FILE *