2014-03-27 5 views
-1

Для задания мне было предложено прочитать из двух отдельных файлов .dat. Я использую ifstreams для этого, но когда я пытаюсь построить, я получаю следующее сообщение об ошибке: /usr/include/c++/4.8/bits/ios_base.h:786:5: error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private. Я сумел отследить обижая линию вниз к этому: NMEAobject fred = get_nmea_object(in_stream1);C++ ifstream для создания объектов

Вот мой файл заголовок

#ifndef NMEAINPUT_H 
#define NMEAINPUT_H 


class NMEAinput { 
public: 
NMEAinput(std::string fn1, std::string fn2); 

private: 
std::ifstream in_stream1; 
std::ifstream in_stream2; 
std::ofstream out_stream; 

bool test_gsv(std::string in_gsv); 
NMEAobject get_nmea_object(std::ifstream in); 
NMEAobject read_rmc(std::string in_rmc); 
std::string* split(std::string in_string,char split_point); 
}; 

#endif 

и вот мой каст файл:

#include <stdlib.h> 
#include <cstdlib> 
#include <iostream> 
#include <fstream> 
#include <list> 
#include "NMEAobject.h" 
#include "NMEAinput.h" 
#include "GPXoutput.h" 

NMEAinput::NMEAinput(std::string fn1, std::string fn2) { 
in_stream1.open(fn1.c_str()); 
in_stream2.open(fn2.c_str()); 
out_stream.open("outfile.gpx"); 
if(!in_stream1||!in_stream2) { 
    std::cout << "Error with data read"; 
} 
std::list<NMEAobject> stream1; 
std::list<NMEAobject> stream2; 
NMEAobject fred = get_nmea_object(in_stream1); 
stream1.push_back(fred); 
stream2.push_back(get_nmea_object(in_stream2)); 
int stream_time = stream1.front().get_time(); 
stream1.pop_front(); 
stream1.push_back(get_nmea_object(in_stream1)); 
stream2.push_back(get_nmea_object(in_stream2)); 
GPXoutput out(out_stream); 
while(!stream1.empty() && !stream2.empty()){ 
    if(stream1.front().get_time() - stream_time < 1){ 
     out.put(stream1.front().convert(),out_stream); 
    } 
    else{ 
     out.put(stream2.front().convert(),out_stream); 
    } 
    stream_time = stream1.front().get_time(); 
    stream1.pop_front(); 
    stream2.pop_front(); 
    stream1.push_back(get_nmea_object(in_stream1)); 
    stream2.push_back(get_nmea_object(in_stream2));*/ 
    // if(stream1.front() == std::NULL || stream2.front() == std::NULL) break; 
} 
} 



NMEAobject NMEAinput::get_nmea_object(std::ifstream in_stream){ 
std::string line; 
bool good_rmc = false; 
bool good_gsv = true; 
while(std::getline(in_stream,line)&&!good_rmc){ 
    std::string data_check = line.substr(0,3); 
    if(data_check == "$GP"){ 
     data_check = line.substr(3,3); 
     if(data_check == "GSV"){ 
      good_gsv = test_gsv(line); 
     } 
     else if (data_check =="RMC"&&good_gsv){ 
      NMEAobject out = read_rmc(line); 
      good_rmc = true; 
      return out; 
     } 
    } 
} 

} 
+0

Пожалуйста, сократите его до минимального * примера. Скорее всего, вы сами находите проблему; если нет, то гораздо более вероятно, что кто-то здесь видит проблему в 10-строчной программе, чем несколько сотен (и вопрос и ответ будут иметь шанс быть полезными и для кого-то еще). – vonbrand

+0

Если NMEAinput не использует потоки после своего конструктора, они должны быть локальными переменными, а не членами. –

ответ

4

iostreams не копируемый, но Вы передаете их по значению:

NMEAobject get_nmea_object(std::ifstream in); // Wrong 

Его следует заменить на:

NMEAobject get_nmea_object(std::ifstream& in); 

Вышеприведенное теперь передается по ссылке, при этом не происходит копия.

В основном ваша проблема сводится к этому (попробуйте скомпилировать эту небольшую программу). Вы увидите в основном те же ошибки, что и сейчас.

#include <fstream> 
using namespace std; 
int main() 
{ 
    ifstream ifs1; 
    ifstream ifs2; 
    ifs1 = ifs2; 
} 
Смежные вопросы