ifstream :: open无法在Visual Studio调试模式下工作

时间:2009-04-28 16:32:31

标签: c++ visual-studio ifstream

我已经在这里讨论了ifstream问题,而且我仍然无法阅读简单的文本文件。我正在使用Visual Studio 2008。

这是我的代码:

// CPPFileIO.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <fstream>
#include <conio.h>
#include <iostream>
#include <string>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{

    ifstream infile;
    infile.open("input.txt", ifstream::in);

    if (infile.is_open())
    {
        while (infile.good())
            cout << (char) infile.get();
    }
    else
    {
        cout << "Unable to open file.";
    }
    infile.close();
    _getch();
    return 0;
}

我已通过检查argv[0]的值确认 input.txt 文件位于正确的“工作目录”中。 Open方法不起作用。

我也在调试时遇到问题 - 如果我无法在infile.good()infile.is_open()上设置监视?我一直在

Error: member function not present.

编辑:使用.CPP文件中的完整代码更新了代码清单。

更新:该文件不在当前工作目录中。这是项目文件所在的目录。将其移动到那里,在VS.NET中进行调试时可以正常工作。

5 个答案:

答案 0 :(得分:8)

在指定打开模式时尝试使用按位OR运算符。

infile.open ("input.txt", ios::ate | ios::in);

openmode参数是位掩码。 ios::ate用于打开文件以进行追加,ios::in用于打开文件以读取输入。

如果您只想阅读文件,可以使用:

infile.open ("input.txt", ios::in);

ifstream的默认打开模式是ios :: in,所以你现在可以完全摆脱它。以下代码使用g ++工作。

#include <iostream>
#include <fstream>
#include <cstdio>

using namespace std;

int main(int argc, char** argv) {
    ifstream infile;
    infile.open ("input.txt");

    if (infile)
    {
        while (infile.good())
            cout << (char) infile.get();
    }
    else
    {
        cout << "Unable to open file.";
    }
    infile.close();
    getchar();
    return 0;
}

答案 1 :(得分:5)

有时,Visual Studio会将您的exe文件从源代码中删除。默认情况下,VS可能只查找从exe文件开始的文件。此过程是一个简单的步骤,用于从与源代码相同的目录中获取输入txt文件。您是否不想修复IDE设置。

using namespace std;

ifstream infile;

string path = __FILE__; //gets source code path, include file name
path = path.substr(0,1+path.find_last_of('\\')); //removes file name
path+= "input.txt"; //adds input file to path

infile.open(path);

希望这可以帮助其他人快速解决问题。我花了一段时间才找到这个设置。

答案 2 :(得分:1)

我在你的代码中发现了两个问题:

a)“ios :: ate || ios :: in”=&gt;中的语法错误应该是“ios :: ate | ios :: in”

b)“ios :: ate”将光标设置为文件末尾 - 所以当你开始阅读时你什么也得不到

所以只需删除“ios :: ate”就可以了。)

侨, 克里斯

答案 3 :(得分:0)

infile.open ("input.txt", ios::ate || ios::in);

||是逻辑或运算符,而不是按位运算符(正如Bill The Lizzard所说)。

所以我猜你做的相当于:

infile.open ("input.txt", true);

(假设ios :: ate或ios :: in都不是0)

答案 4 :(得分:0)

尝试使用:

ifstream fStm("input.txt", ios::ate | ios::in);
  

我也在调试时遇到问题 - 如果我无法在“infile.good()”或“infile.is_open()”上设置监视?我不断收到“错误:成员函数不存在。”

正确包括:

#include <fstream>