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

7

我在 Stack Overflow 上查看了很多有关 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中调试时它可以正常工作。


问题出在工作目录上。当你从命令行运行时,工作目录是显而易见的。但是当你在调试器中运行时,你需要明确设置工作目录,否则它就不那么明显了(检查调试器选项)。 - Martin York
感谢您发布更新部分。自从我需要考虑在调试模式下的工作目录位置以来已经有一段时间了。这节省了我几分钟的思考时间。 - JR Smith
6个回答

8

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

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

Here, ifstream is a class that represents input file stream and "filename" is the name of the file you want to open. This code will open the file in read mode by default.

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;
}

呵呵。有时候我希望我的声望足够高,可以为别人接受答案。 :-) - T.E.D.
仍然没有运气 :( 我注意到我将“infile”作为“fstream”而不是“ifstream”。我删除了ios:ate。打开方法仍然无法工作。 - Dave Swersky
奇怪!我在调试时它不工作,但是当我从命令行运行调试.exe时它完美地工作!有任何想法为什么? - Dave Swersky
3
明白了:我必须使用 _getcwd() 函数获取当前工作目录,这就是“项目文件”所在的目录,而不是解决方案或调试目录。奇怪的是,无论如何硬编码路径,在调试时都不起作用。感谢你的帮助! - Dave Swersky
Dave,你的评论让我省了好几个小时的工作。真心感谢你! - rsp1984
显示剩余2条评论

6
有时候,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);

希望这能帮助其他人快速解决问题。我自己花了很长时间才找到这个设置。


嗨,只是补充一下,对于基于Linux的机器,路径应该是:path = path.substr(0,1+path.find_last_of('/')); //删除文件名 - hariudkmr

1

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

a)"ios::ate || ios::in" 中有语法错误 => 应该是 "ios::ate | ios::in"

b)"ios::ate" 将光标设置到文件末尾 - 因此当你开始读取时,你什么也得不到

所以只需删除 "ios::ate",你就没问题了 :)

再见, Chris


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

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

所以我猜你正在进行等价于:

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

(假设ios::ate和ios::in都不为0)

0

尝试使用:

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

我也遇到了调试的问题- 我应该不能在 "infile.good()" 或者 "infile.is_open()" 上设置监视吗?我一直得到 "错误:成员函数不存在" 的提示。
还有正确的包含文件:
#include <fstream> 

等等。


我在我的cpp文件中有#include <fstream>。 - Dave Swersky
你需要向我们展示完整的文件,以便解决你的第二个问题。顺便问一下,你能读取这个文件吗? - dirkgently
将 ifstream::in 更改为 ios::in。为什么需要 conio.h 或 _getch?这些都是非标准的。您是否安装了 VS2008 SP1? - dirkgently
我添加了conio.h和_getch,只是为了能够在程序终止之前中断执行并等待按键。你认为这会引起问题吗?我将尝试将它们移除。 - Dave Swersky
你能干净地编译代码吗?还是仍然卡在编译上?检查一下你是否安装了SP1,并删除除最低限度以外的所有内容,尝试重新编译。如果还是不行,更新你的帖子。 - dirkgently

0

如果您使用默认的Vs code设置,请将要读取的文本文件放在与可执行文件相同的文件夹中,我知道这不是很美观,但它确实有效。


这个问题是关于VS,而不是VS Code的。对于Code,工作目录可以在launch.json文件中使用cwd 属性进行更改(默认情况下为工作区目录)。 - YurkoFlisk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接