我正在尝试在文件中编写C结构(以二进制编写)并读取它以恢复它。我不知道是否有可能。 这就是我所拥有的:
head.hh:
#include <iostream>
typedef struct s_test
{
char cmd[5];
std::string str;
}t_test;
main.cpp中:
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "head.hh"
int main()
{
t_test test;
int fd = open("test", O_APPEND | O_CREAT | O_TRUNC | O_WRONLY, 0666);
test.cmd[0] = 's';
test.cmd[1] = 'm';
test.cmd[2] = 's';
test.cmd[3] = 'g';
test.str = "hello world";
write(fd, &test, sizeof(t_test));
close(fd);
fd = open("test", O_APPEND | O_CREAT | O_WRONLY, 0666);
t_test test2;
read(fd, &test2, sizeof(t_test));
std::cout << test2.cmd << " " << test2.str << std::endl;
return (0);
}
在输出上我有类似的东西: Ȟ
答案 0 :(得分:1)
要读取的文件是以只写方式打开的。
实际的std::string
对象无法以这种方式编写。实际对象通常包含几个指针,可能是一个大小但不是实际的字符数据。它需要序列化。
如果你要编写C ++,你应该考虑学习使用文件流而不是你在这里得到的。
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <io.h>
#include <iostream>
#include <string>
#include <vector>
typedef struct s_test
{
char cmd[5];
std::string str;
}t_test;
void Write(int fd, struct s_test* test)
{
write(fd, test->cmd, sizeof(test->cmd));
unsigned int sz = test->str.size();
write(fd, &sz, sizeof(sz));
write(fd, test->str.c_str(), sz);
}
void Read(int fd, struct s_test* test)
{
read(fd, test->cmd, sizeof(test->cmd));
unsigned int sz;
read(fd, &sz, sizeof(sz));
std::vector<char> data(sz);
read(fd, &data[0], sz);
test->str.assign(data.begin(), data.end());
}
int main()
{
t_test test;
int fd = open("test", O_APPEND | O_CREAT | O_TRUNC | O_WRONLY, 0666);
test.cmd[0] = 's';
test.cmd[1] = 'm';
test.cmd[2] = 's';
test.cmd[3] = 'g';
test.cmd[4] = 0;
test.str = "hello world";
std::cout << "Before Write: " << test.cmd << " " << test.str << std::endl;
Write(fd, &test);
close(fd);
fd = open("test", O_RDONLY, 0666);
t_test test2;
Read(fd, &test2);
std::cout << "After Read: " << test2.cmd << " " << test2.str << std::endl;
close(fd);
return (0);
}
答案 1 :(得分:0)
查看何时将结构转储到二进制文件中,将其内存映像写入磁盘,例如:
class X
{
public:
int i;
int j;
};
。 。
X lX;
lX.i= 10;
lX.j = 20;
当写入二进制文件时,类lX的对象看起来像| 10 | 20 | 即,当你读到它时,它会正常工作。
但是对于包含任何像string这样的指针的类。
class Y
{
public:
int* pi;
int j;
};
。 。
Y lY;
lY.pi= new int(10); // lets assume this is created at memory location 1001
lY.j = 20;
所以对象lY的pi值为1001(不是10,因为它是一个指针)。现在当你将lY写入二进制文件时,它看起来像| 10001 | 20 |当你将它读回来时,它将构造Y的新对象(比如说lY2),其值pi为1001,j为20.现在我们pi(它是一个指针)指向的是什么?回答是垃圾,这是你在屏幕上看的东西。我猜你使用Windows来运行它,因为Linux会给你一个分段错误。