ifstream :: open не работает в режиме отладки Visual Studio - PullRequest
7 голосов
/ 28 апреля 2009

Я задавал вопросы 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.

РЕДАКТИРОВАТЬ: Обновлен список кодов с полным кодом из .CPP файла.

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

Ответы [ 5 ]

8 голосов
/ 28 апреля 2009

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

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;
}
5 голосов
/ 04 ноября 2012

Иногда Visual Studio убирает ваш exe-файл из исходного кода. По умолчанию 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);

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

1 голос
/ 28 апреля 2009

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

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

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

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

чао, Chris

0 голосов
/ 28 апреля 2009

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

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

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

и включает в себя:

#include <fstream> 

и т.д.

0 голосов
/ 28 апреля 2009
infile.open ("input.txt", ios::ate || ios::in);

|| - логический или оператор, а не побитовый оператор (как сказал Билл Лиззард).

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

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

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

...