2015-11-09 6 views
1

Для проекта, который я делаю, мы должны заполнить очередь объектами «Дом». Объекты «Дома» получают свою информацию из файла с именем «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; 

};

+0

и data.dat выглядит как ...? – sehe

ответ

0

Сначала необходимо инициализировать features и address, либо используя new, либо создав его как массив символов определенной длины. То, как вы это делаете, вы пытаетесь записать в память, которая еще не назначена, - следовательно, переполнение буфера.

0

Для удовольствия, вот очищены версия

  • в основном он заменяет char* с std::string (так как мы делаем 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