我想使用 write()函数将结构对象写入文件。它必须是那个功能。
我在终端的输入是:./ main.c output.dat John Doe 45
当我运行程序并打开output.dat时,有许多字母没有意义。请帮帮我。
我在output.dat文件中想要的输出是:John Doe 45
我的代码:
struct Person{
char* name;
char* lastName;
char* age;
};
int main(int argc, char** argv){
struct Person human;
/* get the argument values and store them into char* */
char* fileName = argv[1];
char* name = argv[2];
char* lastName = argv[3];
char* age = argv[4];
/* set the values of human object */
human.name = name;
human.lastName = lastName;
human.age = age;
/* open the file */
int file = 0;
file = open(fileName, O_RDWR); /* I want to have read&write set! */
write(file, &human, sizeof(human));
close(file);
return 0;
}
答案 0 :(得分:5)
编写结构时,只能在struct
本身中写入值。在您的情况下,这些值是指向内存中其他位置的指针,而不是字符串数据。因此,您最终会编写三个指针的内存地址(在大多数系统上为12或24个字节)并不是那么有用(因为它们适用于当前正在运行的程序的内存空间,这在内存空间上不同下一次运行。)
您将需要设计一种更实用的序列化格式,实际写出字符串的内容,而不是其地址。选项包括简单的换行符或NUL
分隔文本,二进制长度前缀文本,或第三方库以使其正确,CSV,JSON或XML(如果您感觉雄心勃勃,某种数据库)。
例如,对于二进制长度前缀文本,您可能会执行以下操作:
uint32_t len;
len = strlen(name);
write(file, &len, sizeof(len));
write(file, human.name, len);
len = strlen(lastName);
write(file, &len, sizeof(len));
write(file, human.lastName, len);
... repeat for age ...
允许您通过读取每个字符串长度(固定大小)来读回它,然后使用它来计算必须读取多少字节才能获得字符串。
答案 1 :(得分:1)
你不能只写出这个对象。您需要单独写出每个内部指针。
这样的事情:
file = open(fileName, O_RDWR); /* I want to have read&write set! */
write(file, human.name, std::strlen(human.name) + 1);
write(file, human.lastName, std::strlen(human.lastName) + 1);
write(file, human.age, std::strlen(human.age) + 1);
close(file);
注意我将+1
添加到字符串的长度,以确保我也写出终止零。
答案 2 :(得分:1)
如果您知道每个字段的最大长度,则可以尝试将字段设为数组。记得为空字节添加1
struct Person{
char name[32]; //31 char long + null
char lastName[32]; // 31 char long + null
char age[4]; // 3 char long + null
};
然后你的fwrite会正常工作。但是你需要将值绑定到结构中。
strlcpy(human.name, name, sizeof(human.name));
每个字段的等等。 strlcpy确保您的字符串为空终止。
答案 3 :(得分:0)
谢谢大家,我这样解决了。虽然它不理想,但它完成了工作:):
struct Person{
char name[20];
char lastName[20];
char age[20];
};
int main(int argc, char** argv){
struct Person human;
/* get the argument values and store them into char* */
char* fileName = argv[1];
char* name = argv[2];
char* lastName = argv[3];
char* age = argv[4];
sprintf(human.name,name);
sprintf(human.lastName,lastName);
sprintf(human.age,age);
/* open the file */
int file = 0;
file = open(fileName, O_RDWR); /* I want to have read&write set! */
write(file, &human, sizeof(human));
close(file);
return 0;
}