2014-03-27 4 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 

이며, 여기 내 CPP 파일입니다

#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; 
}