【问题标题】:I have an annoying c++ outstream bug我有一个烦人的 C++ 外流错误
【发布时间】:2013-12-16 20:54:42
【问题描述】:

此代码从位于 C:\a\b.txt 的 txt 文件中读取正确的 x,y 坐标集。我知道 ifstream 正在工作,因为我使用 cout 来验证。它不会为我创建新文件。有人建议使用 close(),它会创建一个文件一次。然后我又试了很多次,它不会创建文件。我正在输入:C:\a\c.txt

我认为我的代码没有任何问题。谁能发现问题或提出解决方案?

#include "lib.h"
#include <iostream>
#include <string>

using namespace std;
//....Point class and istream>> operator code

int main()
{
//....ifstream code

std::string filename;
cout << "Enter output filename: ";
std::getline(cin, filename);

ofstream ost(filename.c_str(), std::ofstream::out);
if (!ost.is_open()) cerr << "can't open output file: " << filename << endl;

    for(int i=0; i<points.size(); ++i)
        ost<<'('<<points[i].x<<','<<points[i].y<<')'<<endl;
        cout <<"got here 6"<<endl;

    ost.close();

    keep_window_open();

    return 0;

}

代码运行后,MS 编译器在输出框中给出以下消息:

project chap 10 ex 1.exe': Loaded 'C:\Windows\SysWOW64\ntdll.dll', Cannot find or open the PDB file
'project chap 10 ex 1.exe': Loaded 'C:\Program Files\AVAST Software\Avast\snxhk.dll', Cannot find or open the PDB file
'project chap 10 ex 1.exe': Loaded 'C:\Windows\SysWOW64\kernel32.dll', Cannot find or open the PDB file
'project chap 10 ex 1.exe': Loaded 'C:\Windows\SysWOW64\KernelBase.dll', Cannot find or open the PDB file
'project chap 10 ex 1.exe': Loaded 'C:\Windows\SysWOW64\msvcp100d.dll', Symbols loaded.
'project chap 10 ex 1.exe': Loaded 'C:\Windows\SysWOW64\msvcr100d.dll', Symbols loaded.
'project chap 10 ex 1.exe': Loaded 'C:\Windows\SysWOW64\user32.dll', Cannot find or open the PDB file
'project chap 10 ex 1.exe': Loaded 'C:\Windows\SysWOW64\gdi32.dll', Cannot find or open the PDB file
'project chap 10 ex 1.exe': Loaded 'C:\Windows\SysWOW64\lpk.dll', Cannot find or open the PDB file
'project chap 10 ex 1.exe': Loaded 'C:\Windows\SysWOW64\usp10.dll', Cannot find or open the PDB file
'project chap 10 ex 1.exe': Loaded 'C:\Windows\SysWOW64\msvcrt.dll', Cannot find or open the PDB file
'project chap 10 ex 1.exe': Loaded 'C:\Windows\SysWOW64\advapi32.dll', Cannot find or open the PDB file
'project chap 10 ex 1.exe': Loaded 'C:\Windows\SysWOW64\sechost.dll', Cannot find or open the PDB file
'project chap 10 ex 1.exe': Loaded 'C:\Windows\SysWOW64\rpcrt4.dll', Cannot find or open the PDB file
'project chap 10 ex 1.exe': Loaded 'C:\Windows\SysWOW64\sspicli.dll', Cannot find or open the PDB file
'project chap 10 ex 1.exe': Loaded 'C:\Windows\SysWOW64\cryptbase.dll', Cannot find or open the PDB file
'project chap 10 ex 1.exe': Loaded 'C:\Windows\SysWOW64\imm32.dll', Cannot find or open the PDB file
'project chap 10 ex 1.exe': Loaded 'C:\Windows\SysWOW64\msctf.dll', Cannot find or open the PDB file
'project chap 10 ex 1.exe': Loaded 'C:\Windows\SysWOW64\dwmapi.dll', Cannot find or open the PDB file
The thread 'Win32 Thread' (0xacc) has exited with code 0 (0x0).
The program '[6132] project chap 10 ex 1.exe: Native' has exited with code 0 (0x0).

【问题讨论】:

  • 这些只是调试符号。它告诉你它找不到系统库的调试符号。
  • 我的问题是:我认为我的代码没有任何问题。谁能发现问题或提出解决方案?
  • 是的,如果打开文件有问题,就会执行for循环。
  • ifstream 正在工作 的事实似乎毫无用处,因为您没有在程序中使用任何 ifstream。为什么你认为值得一提?
  • 如果你为istream重载operator&gt;&gt;,你也应该在点结构中为ostream重载operator&lt;&lt;

标签: c++ file-io iostream


【解决方案1】:
#include "lib.h"
#include <iostream>
#include <string>

using namespace std;
//....Point class and istream>> operator code

int main()
{
    //....ifstream code
    ofstream ost(filename, std::ofstream::out); // filename is never initialized?
    if (ost.is_open()) 
    {
        for(int i=0; i<points.size(); ++i)
        {
            ost<<'('<<points[i].x<<','<<points[i].y<<')'<<endl;
        }
        cout <<"got here 6"<<endl;
        ost.close();
    }
    else
    {
        cerr << "Unable to open file:  " << filename << endl;
    }

    keep_window_open();
    return 0;
}

使用您显示的代码,唯一的问题(除了您可怕的格式)是您从未初始化filename,并且如果它无法打开,您仍然尝试写入ofstream

【讨论】:

  • 不,我确实初始化了。我忘记展示了。这不是我的格式。正如我在之前的 cmets 中所说。我从其他论坛刷了所有的流代码,试图解决我最初的问题。我真的对格式化不起作用且快速修复的代码不感兴趣。我似乎已经解决了这个问题。我认为 Avast 阻止我打开文件。我想。
  • 顺便说一句,我不明白为什么其他人找不到问题或找到解决方案的代码,结果被病毒软件阻止,是-1我的声誉。
猜你喜欢
  • 2011-10-21
  • 2013-03-01
  • 2012-05-23
  • 2014-05-20
  • 2012-03-11
  • 2012-02-22
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
相关资源
最近更新 更多