ifstream::open не работает в режиме отладки Visual Studio

Я задавал вопросы ifstream здесь, на SO, и у меня все еще возникают проблемы с чтением простого текстового файла. Я работаю с 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;
}

Я убедился, что файл input.txt находится в правильном «рабочем каталоге», проверив значение argv[0]. Метод Open просто не сработает.

У меня также возникают проблемы с отладкой: нельзя ли установить часы на infile.good() или infile.is_open()? я продолжаю получать

Error: member function not present.

EDIT: Обновлен список кодов с полным кодом из файла .CPP.

ОБНОВЛЕНИЕ: файл НЕ находился в текущем рабочем каталоге. Это каталог, в котором находится файл проекта. Переместил его туда и работает при отладке в VS.NET.


person Dave Swersky    schedule 28.04.2009    source источник
comment
Это рабочий каталог, который является вашей проблемой. Когда вы запускаете его из командной строки, рабочий каталог очевиден. Когда вы запускаете его в отладчике, вам нужно явно указать рабочий каталог, иначе это не так очевидно (проверьте параметры отладчика).   -  person Martin York    schedule 29.04.2009
comment
Спасибо за публикацию раздела обновления. Прошла минута с тех пор, как мне нужно было подумать о том, где находится рабочий каталог в режиме отладки. Сэкономил мне несколько минут царапания головы.   -  person JR Smith    schedule 25.06.2014


Ответы (5)


Попробуйте использовать побитовый оператор ИЛИ при указании режима открытия.

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;
}
person Bill the Lizard    schedule 28.04.2009
comment
Хе. Иногда мне хочется, чтобы моя репутация была достаточно высокой, чтобы принять ответ за кого-то другого. :-) - person T.E.D.; 28.04.2009
comment
Все еще не повезло :( Я заметил, что у меня был infile как fstream вместо ifstream. Я удалил ios: ate. Метод open все еще не работает. - person Dave Swersky; 28.04.2009
comment
странно! Это не работает, когда я отлаживаю, но отлично работает, когда я запускаю отладочный .exe из командной строки! Есть идеи, почему? - person Dave Swersky; 28.04.2009
comment
Более интересно: когда я открываю командную строку Visual Studio 2008 и запускаю оттуда, я получаю сообщение об ошибке. Это работает, когда я использую командную строку Windows... - person Dave Swersky; 28.04.2009
comment
ПОНЯЛ: мне пришлось использовать функцию _getcwd(), чтобы получить текущий рабочий каталог, который был каталогом файла проекта, а НЕ каталогом решения или отладки. Как ни странно, никакое жесткое кодирование пути не сработало при отладке. Спасибо за вашу помощь! - person Dave Swersky; 28.04.2009
comment
Пожалуйста, за ту небольшую помощь, которую я смог оказать. Похоже, вы прошли через большую часть этого самостоятельно. :) - person Bill the Lizard; 29.04.2009
comment
Дэйв, твои комментарии только что сэкономили мне часы работы. Не могу отблагодарить вас достаточно! - person rsp1984; 15.12.2013

Иногда Visual Studio помещает исполняемый файл отдельно от исходного кода. По умолчанию VS может искать только файл, начинающийся с вашего exe-файла. Этот процесс представляет собой простой шаг для получения входного текстового файла из того же каталога, что и ваш исходный код. Если вы не хотите исправлять настройки 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);

Надеюсь, это поможет другим людям для быстрого решения. Мне потребовалось некоторое время, чтобы найти эту настройку самостоятельно.

person Dustin Taylor    schedule 04.11.2012
comment
привет, просто добавить. Для машины на базе Linux путь должен быть path = path.substr(0,1+path.find_last_of('/')); //удаляем имя файла - person hariudkmr; 17.05.2020

Я нашел две проблемы в вашем коде:

а) синтаксическая ошибка в "ios::ate || ios::in" => должна быть "ios::ate | ios::in"

б) "ios::ate" устанавливает курсор в конец файла, так что вы ничего не получите, когда начнете читать

Так что просто удалите «ios :: ate», и все в порядке :)

Чао, Крис

person 3DH    schedule 28.04.2009

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

|| - это логический оператор or, а не побитовый оператор (как сказал Билл Ящерица).

так что я думаю, вы делаете эквивалент:

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

(при условии, что ни ios::ate, ни ios::in не равны 0)

person Tom    schedule 28.04.2009

Попробуйте использовать:

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

У меня также возникают проблемы с отладкой — нельзя ли установить часы на «infile.good()» или «infile.is_open()»? Я продолжаю получать сообщение «Ошибка: функция-член отсутствует».

а собственно включает:

#include <fstream> 

и т. д.

person dirkgently    schedule 28.04.2009
comment
У меня есть #include ‹fstream› в моем файле cpp. - person Dave Swersky; 28.04.2009
comment
Вам нужно показать нам полный файл, чтобы решить вашу вторую проблему. Кстати, вы смогли прочитать в файле? - person dirkgently; 28.04.2009
comment
Измените ifstream::in на ios::in. Зачем вам conio.h или _getch? Эти нестандартные. У вас установлен VS2008 SP1? - person dirkgently; 28.04.2009
comment
Я добавил conio.h и _getch только для того, чтобы иметь возможность прервать выполнение и дождаться нажатия клавиши, прежде чем программа завершится. Думаете, это вызовет проблемы? Я попробую их удалить. - person Dave Swersky; 28.04.2009
comment
Умеете ли вы правильно компилировать свой код? Или вы все еще застряли с компиляцией? Проверьте, установлен ли у вас SP1 или нет, удалите все, кроме самого минимума, и попробуйте скомпилировать. Обновите свой пост, если это не так. - person dirkgently; 28.04.2009