将结构写入二进制文件 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,不包含指针,所以如果你读回文件数据应该没问题。通常有关二进制文件写入/读取的问题是因为structclass 不适合保存到二进制文件,但是您的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++ 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 中读取文件时动态分配内存给结构

如何读取和写入非固定长度的结构到二进制文件c++

在 C++ 中为结构读取二进制文件的运行时错误

Python Pandas 如何从命令行读取 C++ 结构二进制文件

在 C++ 中通过迭代器将向量写入二进制文件的正确方法

如何使用 C++ 以二进制模式将向量写入文件?