0

我正在尝试将内容复制document1.txtdocument2.txt使用这个简单的程序:

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

但是,当我运行程序时,我发现它document2.txt仍然是空的。

有什么问题?

4

4 回答 4

1

“我已经手动创建document1.txtdocument2.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;
}

请注意,在这种情况下,您实际上不需要刷新任何缓冲区,也不需要显式关闭流。当这些对象被破坏时,所有这些都会自动发生,即当执行超出范围时。

于 2013-10-25T11:00:12.817 回答
1
    ifstream in("document1.txt");
    ofstream out("document2.txt");
    string str;
    while(getline(in,str))
    {
        out<<str;
    }
    in.close(); // <---
    out.close(); // <---

有一个关闭它的功能。请检查:ifstreamofstream

于 2013-10-25T10:56:23.377 回答
0
ifstream document1("document1.txt");
ofstream document2("document2.txt");
string str;
getline(document1, str);
document2<< str<< endl;
document1.close();
document2.close();

试试这个代码。这个对我有用。

于 2013-10-25T10:54:15.033 回答
0

测试.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;
}

文档1.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



PS如果您将 test.cpp 的第 9 行从更改为document2.txt,则在 Mac 和 Linux PS 下测试的所有代码
变为out<<str<<endl;out<<str;

 aaaaaaaabbb bbbc c c cd 

因为该getline(in,str)函数会从中提取字符in并将它们存储到str'\n' 或找到文件结尾
这意味着str不包含'\n'。您需要自己添加'\n'。
正如 LihO 所说,C++ 下的PS,您不需要关闭inand out,因为inandout将在第 10 行关闭}
此外,执行第 9 行时您不需要刷新,因为endl具有刷新功能。

于 2015-06-10T16:51:11.157 回答