【问题标题】:Copying contents of one file to another leaves the other file empty将一个文件的内容复制到另一个文件会使另一个文件为空
【发布时间】:2013-10-25 10:47:20
【问题描述】:

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

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

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

可能出了什么问题?

【问题讨论】:

  • 你检查文件是否真的打开了吗?
  • 您没有明确关闭流,因此它们在超出范围之前不会被刷新/关闭。这是您的整个计划,还是之后发生的其他事情?
  • @阿里·阿拉米里。感谢您的回复。我在开始时手动创建了它们。会不会是这个问题?
  • 请发布一些您如何“创建”、打开和关闭它们的代码。
  • @benjymous。是的,这就是整个程序

标签: c++ visual-studio visual-c++ file-io ofstream


【解决方案1】:
    ifstream in("document1.txt");
    ofstream out("document2.txt");
    string str;
    while(getline(in,str))
    {
        out<<str;
    }
    in.close(); // <---
    out.close(); // <---

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

【讨论】:

  • 当任一流对象超出范围时,它们将被破坏并关闭流。无需显式调用close
【解决方案2】:

“我手动创建了document1.txtdocument2.txt

如果您直接从 Visual Studio 运行程序,请注意工作目录默认设置为 $(ProjectDir),即这些文件必须放在您的项目文件所在的同一目录中 (.vcproj / @987654325 @) 是。

您可以将它们放置到适当的目录或指定完整路径,例如将它们直接放置到 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;
}

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

【讨论】:

  • 我已经按照您的建议指定了完整路径,并且我创建的文档在同一个项目的文件夹中,但仍然存在同样的问题。有任何想法吗?谢谢
  • @Simplicity: 你添加了检查是否out.is_open() 的行吗?输出错误了吗?
  • @Simplicity:也不要显式创建输出文件。让您的程序创建它。
  • 是的,我在 while 循环之前添加了检查,并删除了我手动创建的 document2.txt,并且没有任何错误。但是,问题仍然存在......
【解决方案3】:
ifstream document1("document1.txt");
ofstream document2("document2.txt");
string str;
getline(document1, str);
document2<< str<< endl;
document1.close();
document2.close();

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

【讨论】:

    【解决方案4】:

    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
    



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

     aaaaaaaabbb bbbc c c cd 
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 2018-05-10
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      相关资源
      最近更新 更多