2013-05-07 3 views
2

Я пишу очень базовую программу, которая берет содержимое двух файлов и добавляет их вместе в третий файл. Мой код выглядит следующим образом:Функции iostream, дающие мне ошибку C2248

#include "std_lib_facilities.h" 

string filea, fileb, 
    contenta, contentb; 

string getfile() 
{ 
string filename; 
bool checkname = true; 
while (checkname) 
{ 
cout << "Please enter the name of a file you wish to concatenate: "; 
cin >> filename; 
ifstream firstfile(filename.c_str()); 
if (firstfile.is_open()) 
{ 
    cout << filename << " opened successfully.\n"; 
    checkname = false; 
} 
else cout << "Cannot open " << filename << endl; 
} 
return filename; 
} 

string readfile(ifstream ifs) 
{ 
string content; 
while (!ifs.eof()) 
{ 
    string x; 
    getline(ifs, x); 
    content.append(x); 
} 
return content; 
} 

int main() 
{ 
ifstream firstfile(getfile().c_str()); 
ifstream secondfile(getfile().c_str()); 
ofstream newfile("Concatenated.txt"); 

newfile << readfile(firstfile) << endl << readfile(secondfile); 
system("PAUSE"); 
firstfile.close(); 
secondfile.close(); 
newfile.close(); 
return 0; 
} 

Когда я пытаюсь скомпилировать этот код, однако, я получаю эту ошибку:

error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>' 

Я не знаю, что является причиной этой ошибки, хотя я подозреваю, что это имеет какое-то отношение к выполняемым мной функциям, поскольку у меня не было этой ошибки перед созданием функций.

Любая помощь с благодарностью, заблаговременно за любые ответы.

ответ

3

Вы определили свой readfile, чтобы передать поток по значению, для которого потребуется доступ к конструктору копии потока. Это личное, потому что вы не должны копировать потоки. Передайте поток вместо ссылки (затем перепишите readfile, чтобы исправить цикл, так как while (!xxx.eof()) не работает).

+0

Это сработало, спасибо! –

2

сделать ссылку

string readfile(ifstream & ifs) { 
//      ^

fstream, потому что не копируемый.

+0

Кроме того, вы можете сделать это 'istream', потому что вы не используете его собственный интерфейс. Кроме того, создайте цикл 'while (getline (...))', как проверку EOF, прежде чем пытаться что-то прочитать, но используя (мусор) результаты после того, как это не очень хорошая идея. –

+0

Хорошие идеи, спасибо! –

Смежные вопросы