将结构写入二进制文件 C++ 时遇到问题
Posted
技术标签:
【中文标题】将结构写入二进制文件 C++ 时遇到问题【英文标题】:Having trouble writing a structure to a binary file C++ 【发布时间】:2020-04-20 18:27:53 【问题描述】:我正在尝试编写一个代码,它需要一个结构,询问用户信息并将数据放入一个名为“输出”的二进制文件中,以便可以读取它。我尝试用我的代码来做,但它不起作用。任何人都可以帮我解决它并告诉我我做错了什么吗? 这是我正在处理的代码。
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string>
#include <iomanip>
#include <stdio.h>
#include <string.h>
using namespace std;
const int NAME_SIZE = 20;
struct Student
char fname[NAME_SIZE];
int id;
;
int main()
int choice;
fstream file;
Student person;
cout << "Populate the records of the file." << endl;
file.open("output", ios::out | ios::binary);
cout << "Populating the record with information."<< endl;
cout << "Enter the following data about a person " << endl;
cout << "First Name: "<< endl;
cin.getline(person.fname, NAME_SIZE);
cout << "ID Number: "<< endl;
cin >> person.id;
file.write(reinterpret_cast<char *>(&person), sizeof(person));
file.close();
return 0;
非常感谢任何帮助
【问题讨论】:
为什么你认为它不起作用?只是说“它不起作用”根本没有什么帮助。准确地说出哪里出了问题,以及您期望发生的事情。顺便说一句,您的代码对我来说看起来不错,所以可能是您的期望错误,而不是代码。 当我尝试运行代码时,文件上的文本和符号却乱七八糟 这就是二进制输出的样子。 重要的是你能从你的文件中读回相同的信息吗?这就是它是否有效的测试。 @King struct是POD,不包含指针,所以如果你读回文件数据应该没问题。通常有关二进制文件写入/读取的问题是因为struct
或class
不适合保存到二进制文件,但是您的Student
结构是可以的。
【参考方案1】:
您正在混合原始二进制数据和字符串数据。如果名称短于 NAME_SIZE
,您正在编写的文件名后面可能有不可打印的字符。 int id
也被写成一个不可打印的整数。
如果你想像二进制协议一样存储和加载二进制数据,这种存储是有效的。
如果要将数据存储为可读文本,则必须先序列化数据,但无法使用简单的 read
加载它们
【讨论】:
我将如何更改它以便我不会混合数据?【参考方案2】:正确的方法是为Student定义一个运算符>。然后处理保存和读取结构就是小菜一碟了。
std::ostream & operator<<(std::ostream & os, Student const & rhs)
for(int i=0; i<NAME_SIZE; ++i)
os << rhs.fname[i];
os << id;
return os;
std::istream & operator>>(std::istream & is, Student & rhs)
for(int i=0; i<NAME_SIZE; ++i)
is >> rhs.fname[i];
is >> id;
return is;
因此,当您需要保存到文件时,您只需:
file << person;
当您需要从中读取时:
file >> person;
P.S.:我建议使操作符实现比这更健壮,也许通过特殊标记,以便您可以在读取文件时检测问题。
【讨论】:
以上是关于将结构写入二进制文件 C++ 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章