如何从数据文件中读取向量结构

Posted

技术标签:

【中文标题】如何从数据文件中读取向量结构【英文标题】:How Read from a Data File into a Structure of Vectors 【发布时间】:2014-03-07 23:02:27 【问题描述】:

我试图弄清楚如何将保存到 .dat 文件“customer.dat”的二进制数据存储到向量结构中。我以为我有过几次,但没有运气。

基本上,我有一种将数据存储到 .dat 文件中的工作方法,即 newEntry 函数,但我似乎无法解决如何将数据一次一组带回向量的顺序结构中.有问题的函数是 searchDisplay 函数。代码如下:

#include <iostream>
#include <fstream>
#include <vector>
#include <iomanip>
#include <string>
#include <cstring>
#include <cctype>

using namespace std; 

const int NAME_SIZE = 51, ADDR_SIZE = 51, PHONE_SIZE = 14;

struct Client 
char name[NAME_SIZE];
char address1[ADDR_SIZE];
char address2[ADDR_SIZE];
char phone[PHONE_SIZE];
double acctBal;
double lastPay;
;  


//void welcome();
int menu();
int newEntry();
int searchDisplay();

int main() 
    int selection;
    int option = 0;
    int end;

    //welcome();

    while (option != 6) 
        selection = menu();

        if (selection == 1) 
            cin.ignore();
            end = newEntry();
            if (end == 0) 
                return 0;
            
         else if (selection == 2) 
            end = searchDisplay();
            if (end == 0) 
                return 0;
            
            
    
return 0;


int menu() 
int selection;
cout << "User please enter the number that corresponds with what you wish to do..."               
         << endl;
    cout << "1)     Add An Entry" << endl
         << "2)     Search for a Specfic Person and erase." << endl;
    cin  >> selection;

    return selection;


int newEntry() 
    string input;
    Client person;
    char response = 'y';

    //create file object and open file
    fstream customer("customer.dat", ios::app | ios::binary);

    if (!customer) 
        cout << "Error opening file. Program aborting." << endl;
        return 0;
    

do 
        cout << "Enter person information:" << endl << endl;
        cout << "Name:                                " << endl;
        getline(cin, input);
        strcpy(person.name, input.c_str());
        cout << endl << person.name;

        cout << endl << "Street Adress (And Apartment Number):" << endl;
        cin  >> person.address1;
        getline(cin, input);
        strcpy(person.address1, input.c_str());

        cout << endl << "City, State, Zipcode:                " << endl;
        cin  >> person.address2;
        getline(cin, input);
        strcpy(person.address2, input.c_str());

        cout << endl << "Phone:                               " << endl;
        cin  >> person.phone;
        getline(cin, input);
        strcpy(person.phone, input.c_str());

        cout << endl << "Account Balance:                     " << endl;
        cin  >> person.acctBal;
        //input validation to ensure a non neg number
        cin.ignore();

        cout << endl << "Last Payment:                        " << endl;
        cin  >> person.lastPay;
        //input validation to ensure a non neg number

        customer.write(reinterpret_cast<char *>(&person), sizeof(person));

        cout << endl << "Do you want to enter another record? (Enter Y for Yes, N for No) " << endl;

        cin >> response;

        cout << "_______________________________________________" << endl << endl;

        if (toupper(response) == 'Y') 
            cin.ignore();
        
     while (toupper(response) == 'Y');

    customer.close();

    return 1;


/********************************************
 My main problem is with the below function
 ********************************************/

int searchDisplay() 
    vector<Client> store(2);
    Client foo;
    int i = 0;

    fstream customer("customer.dat", ios::in | ios::binary);

    if (!customer) 
        cout << "Error opening file. Program aborting." << endl;
        return 0;
    

    //MY HOPE WAS THIS WOULD STORE EACH SET OF DATA INTO THE STRUCTURE OF VECTORS

    customer.read(reinterpret_cast<char *>(&store), sizeof (store[0]));

    while (!customer.eof())
        cout << store[i].name << ":" << endl
             << store[i].address1 << endl
             << store[i].address2 << endl
             << store[i].phone << endl
             << store[i].acctBal << endl
             << store[i].lastPay << endl << endl;

        i++;

        customer.read(reinterpret_cast<char *>(&store), sizeof (store[i]));
    

    customer.close();
    return 1;

抱歉,如果任何编码的缩进有点偏离,我在将代码放在文本块上的方法上遇到问题。

但是,是的,任何帮助都会很棒。这是我第一次大量使用矢量,也是第一次使用更多文件类。

【问题讨论】:

作为建议:您的代码缩进有问题,因为您混合了制表符和空格…… 【参考方案1】:

您的第一个问题是打开数据文件进行写入。您当前使用标志“ios::app”打开它,而它应该是“ios::out”。在这里(gcc 版本 4.7.2)我用“ios::app”打开文件时没有输出到文件。 使用 "ios::out" 它创建一个文件并将数据转储到其中。

第二个问题是在你打开和读取文件的那一行。您缺少“[0]”。检查下面的更正版本:

customer.read(reinterpret_cast&lt;char *&gt;(&amp;store[0]), sizeof (store[0]));

进行这些修改可以更接近预期的结果。

这里的主要问题是写入和读取二进制文件与常规文本文件有点不同,例如,具有行尾指示。您需要以不同的方式组织数据,这可能非常复杂。试试Serializing with Boost。

【讨论】:

我想我会尝试你的更正版本,如果这不能让我完全达到我想要的位置,我会尝试不使用二进制文件。我一开始坚持二进制的唯一原因是因为教科书声称在向文本文件中添加数值时效率更高。 这对我的问题有用。谢谢!但现在它削减了每个地址的第一个字,所以我想我仍然会恢复到常规数据文件并避免二进制

以上是关于如何从数据文件中读取向量结构的主要内容,如果未能解决你的问题,请参考以下文章

如何从 QDataStream 中读取数组

如何从文件中读取行并将其切割成碎片?

如何在 C++ 中读取文件并将文件中的数据插入到类类型的向量中?

如何从字符向量中解析 CSV 数据以提取数据框?

C程序:从文件中读取矩阵数据,并显示出来,利用链式存储结构。

C程序:从文件中读取矩阵数据,并显示出来,利用链式存储结构。