【问题标题】:Reading in line by line from a file with different variable types从具有不同变量类型的文件中逐行读取
【发布时间】:2015-11-09 20:49:08
【问题描述】:

对于我正在做的一个项目,我们必须用“House”对象填充一个队列。 “House”对象从名为“data.dat”的文件中获取信息。文件的每一行都是另一个进入房子对象的东西。所以首先我取一个 char* 作为地址,然后是一个 int,另一个 int,第三个 int,然后是另一个 char*。我们并没有大声使用字符串来获取 char* 变量,我相信这是我遇到问题的地方。每次我编译它都会告诉我我有一个分段错误。这是我的 queue.cpp 的区域,我很确定错误在

#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();

}

这是房子对象的头文件:

    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;

};

【问题讨论】:

  • 和 data.dat 看起来像...?

标签: c++ file file-io fault


【解决方案1】:

您需要先初始化featuresaddress,方法是使用new 或将其创建为一定长度的字符数组。 你这样做的方式是试图写入尚未分配的内存 - 因此缓冲区溢出。

【讨论】:

    【解决方案2】:

    为了好玩,这里有一个清理过的版本

    • 主要是用std::string替换char*(因为我们在做C++)
    • 它使整个事物自成一体。
    • 它使用正确的输入验证(不要使用while (!infile.eof()),检查提取运算符)

    我没有实现你的队列 :)

    Live On Coliru

    #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
    

    它打印输出:

    Address: Blv. Dreams Abroken 24, 78377d XG, ClassyCode
    Footage: 2
    Bed rooms:   4
    Bath rooms:   1
    Features:  pool sauna porch indoor-parking
    
    Address: Oyi. Qernzf Noebxra 24, 78377q KT, PynfflPbqr
    Footage: 3
    Bed rooms:   8
    Bath rooms:   2
    Features:  cbby fnhan cbepu vaqbbe-cnexvat
    

    【讨论】:

      猜你喜欢
      • 2013-01-30
      • 1970-01-01
      • 2016-05-14
      • 2016-06-19
      • 2014-06-20
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多