从具有不同变量类型的文件逐行阅读逐行阅读

问题描述 投票:0回答:2
对于我正在做的项目,我们必须用“房屋”对象填充队列。 “房屋”对象从称为“ data.dat”的文件中获取信息。文件的每一行都是进入房屋对象的另一件事。因此,首先,我为地址带一个char*,然后是一个int,另一个int,第三个int,然后是另一个char*。

我们不允许使用字符串获取char*变量,我认为这是我遇到问题的地方。每次我编译时,它都会告诉我我有一个细分错误。这是我的队列的区域,我很确定错误是in

#include"queue.h" #include<iostream> #include<fstream> #include<istream> Queue::Queue(const char *filename){ head = NULL; tail = NULL; std::ifstream infile(filename); char * address = NULL; int footage = 0; int bedrooms = 0; int bathrooms = 0; char * features = NULL; while(!infile.eof()){ while(infile.get() != '\n'){ //std::cout << infile.get(); infile.get(address[i]); } infile >> footage >> bedrooms >> bathrooms; while(infile.get() != '\n'){ infile.get(features[i]); } enqueue(House(address, footage, bedrooms, bathrooms, features)); } infile.close(); }

HORE是房屋对象标头文件:

House(); House(char * ad, int fo, int be, int ba, char * fe); char * getAddress(); int getFootage(); int getBedrooms(); int getBathrooms(); char * getFeatures(); void setAddress(char * ad); void setFootage(int fo); void setBedrooms(int be); void setBathrooms(int ba); void setFeatures(char * fe); friend std::ostream& operator<<(std::ostream& out, House& house); private: char * address; int footage; int bedrooms; int bathrooms; char * features; };

	
c++ file file-io fault
2个回答
0
投票
features

或创建它作为一定长度的字符来初始化

address
new
。 您正在尝试写入尚未分配的内存的方式 - 因此缓冲区溢出。

为了娱乐,这是一个清理的版本

0
投票

它替换为

char*
    (因为我们正在做C ++)
  • 这使整个事物独立。
    
    使用正确的输入验证(不要使用
    std::string
    ,检查提取操作员)
  • 我没有实现您的队列:)
  • live在coliru
while (!infile.eof())

输入:

#include <iostream> #include <fstream> #include <sstream> struct House { House() : address(), footage(0), bedrooms(0), bathrooms(0), features() { } House(std::string ad, int fo, int be, int ba, std::string fe) : address(ad), footage(fo), bedrooms(be), bathrooms(ba), features(fe) { } std::string getAddress() const { return address; } int getFootage() const { return footage; } int getBedrooms() const { return bedrooms; } int getBathrooms() const { return bathrooms; } std::string getFeatures() const { return features; } void setAddress(std::string ad) { address = ad; } void setFootage(int fo) { footage = fo; } void setBedrooms(int be) { bedrooms = be; } void setBathrooms(int ba) { bathrooms = ba; } void setFeatures(std::string fe) { features = fe; } friend std::ostream &operator<<(std::ostream &out, House const &house) { return out << "Address: " << house.getAddress() << '\n' << "Footage: " << house.getFootage() << '\n' << "Bed rooms: " << house.getBedrooms() << '\n' << "Bath rooms: " << house.getBathrooms() << '\n' << "Features: " << house.getFeatures() << '\n'; } private: std::string address; int footage; int bedrooms; int bathrooms; std::string features; }; struct Queue { Queue(std::string filename); struct Node { House value; Node* next; }; Node *head, *tail; void enqueue(House const& h) { // TODO std::cout << h << "\n"; } }; Queue::Queue(std::string filename) : head(nullptr), tail(nullptr) { std::ifstream infile(filename); std::string address; int footage = 0; int bedrooms = 0; int bathrooms = 0; std::string features; std::string line; // lines while (getline(infile, address) && getline(infile, line)) { std::istringstream iss(line); if (iss >> footage >> bedrooms >> bathrooms && getline(iss, features)) { enqueue(House(address, footage, bedrooms, bathrooms, features)); } } } int main() { Queue q("data.dat"); } 打印输出: Blv. Dreams Abroken 24, 78377d XG, ClassyCode 2 4 1 pool sauna porch indoor-parking Oyi. Qernzf Noebxra 24, 78377q KT, PynfflPbqr 3 8 2 cbby fnhan cbepu vaqbbe-cnexvat


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.