2013-10-25 3 views
0

Я пытаюсь скопировать содержимое document1.txt в document2.txt, используя эту простую программу:Копирование содержимого одного файла в другой оставляет другой файл пустой

int main() { 
    ifstream in("document1.txt"); 
    ofstream out("document2.txt"); 
    string str; 
    while(getline(in,str)) 
     out<<str; 
} 

Но, когда я запускаю программу, я считаю, что document2.txt все еще пуст.

Что может быть неправильным?

+0

Вы проверили, действительно ли файлы открыты? –

+0

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

+0

@ Ali Alamiri. Спасибо за ваш ответ. Я создал их вручную в начале. Это может быть проблема? – Simplicity

ответ

0
ifstream document1("document1.txt"); 
ofstream document2("document2.txt"); 
string str; 
getline(document1, str); 
document2<< str<< endl; 
document1.close(); 
document2.close(); 

Пробуйте этот код. Меня устраивает.

1
ifstream in("document1.txt"); 
    ofstream out("document2.txt"); 
    string str; 
    while(getline(in,str)) 
    { 
     out<<str; 
    } 
    in.close(); // <--- 
    out.close(); // <--- 

Есть функция закрыть его. Пожалуйста, проверьте это: ifstream и ofstream.

+0

Когда объект потока выходит за пределы области видимости, они будут разрушены и закроют поток. Нет необходимости явно называть 'close'. –

1

«Я создан вручную document1.txt и document2.txt»

В случае, если вы запускаете вашу программу непосредственно из Visual Studio, обратите внимание, что рабочий каталог устанавливается в $(ProjectDir) по умолчанию, то есть эти файлы должны быть помещены в тот же каталог, где находится файл вашего проекта (.vcproj/.vcxproj).

Вы можете либо поместить их в соответствующий каталог или указать полный путь, например, размещать их непосредственно C: и в коде сделать:

ifstream in("C:\\document1.txt"); 
ofstream out("C:\\document2.txt"); 

Это то, что вы заметите, если вы выводимый что-то в случае ошибки при открытии:

if (!out.is_open()) 
{ 
    std::cout << "ERROR: Can not open document2.txt" << std::endl; 
    return -1; 
} 

Заметим, что в этом случае вы не на самом деле нужно, чтобы очистить любой буфер, ни закрывать потоки в явном виде. Все это произойдет автоматически, когда эти объекты будут уничтожены, то есть когда выполнение выходит за рамки.

+0

Я указал полный путь, как вы рекомендовали, и созданные мной документы находятся в папке того же проекта, но все еще имеют одинаковую проблему. Есть идеи? Спасибо – Simplicity

+0

@Simplicity: добавили ли вы строки, которые проверяют, 'out.is_open()'? Выпустила ли ошибка? – LihO

+0

@ Простота: Также не создавайте выходной файл явно. Пусть ваша программа создаст его. – LihO

0

test.cpp

#include <iostream> 
#include <fstream> 
using namespace std; 
int main() { 
    ifstream in("document1.txt"); 
    ofstream out("document2.txt"); 
    string str; 
    while(getline(in,str)) 
     out<<str<<endl; 
} 

document1.txt

aaaaaaaa 
bbb bbb 
c c c c 
d 

под командной строки вы можете сделать

$g++ test.cpp -o test.out 
$test.out 

И тогда вы получите document2.txt

aaaaaaaa 
bbb bbb 
c c c c 
d 



P.S. Весь код, протестированный под Mac и Linux
P.S., если вы измените 9-ю строку test.cpp от out<<str<<endl; до out<<str;
document2.TXT бы становится

aaaaaaaabbb bbbc c c cd 

, потому что функция getline(in,str) бы извлекает символы из in и заносит их в str до «\ п» или конец из файла найден.
Значок str не содержит "\ n". Вам нужно добавить '\ n' самостоятельно.
P.S. под C++, как говорит LIHO, вам не нужно, чтобы закрыть in и out, так как in и out будет закрыт на линии 10 }
Кроме того, вам не нужно промывать при выполнении линии 9, так как endl имеет флеш-функция.

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