2009-04-28 5 views
7

Я был на всех вопросах ifstream здесь, и я все еще испытываю трудности при чтении простого текстового файла. Я работаю с Visual Studio 2008.ifstream :: open не работает в режиме отладки Visual Studio

Вот мой код:

// 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 файла.

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

+0

Его рабочий каталог, который является вашей проблемой. Whem вы запускаете его из командной строки, рабочий каталог очевиден. Когда вы запустите его в отладчике, вам нужно явно указать рабочий каталог, иначе это не так очевидно (проверьте параметры отладчика). –

+0

Благодарим за публикацию раздела обновления. Прошла минута, так как мне нужно было подумать о том, где рабочий каталог находится в режиме отладки. Сэкономил мне несколько минут царапин на голове. –

ответ

8

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

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

Параметр openmode представляет собой битовую маску. ios::ate используется для открытия файла для добавления, а ios::in используется для открытия файла для чтения ввода.

Если вы просто хотите, чтобы прочитать файл, вероятно, можно просто использовать:

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

Открытый режим по умолчанию для ifstream является ИОС :: в, так что вы можете избавиться от этого вообще Теперь. Следующий код работает для меня с помощью 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; 
} 
+0

Хех. Иногда мне хотелось бы, чтобы мой представитель был достаточно высоким, чтобы принять ответ за кого-то другого. :-) –

+0

Еще не повезло :( Я заметил, что у меня был «infile» как «fstream» вместо «ifstream». Я удалил ios: ate. Открытый метод все еще не работает. –

+0

Bizarre! не работает, когда я отлаживаю, но он отлично работает, когда я запускаю debug .exe из командной строки! Любые идеи почему? –

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

|| является логическим или оператором, а не оператор побитового (как сказал Билл Lizzard).

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

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

(при условии, ни ИОС :: ели или ИОС :: в равны 0)

0

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

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

I'm also having trouble debugging- should I not be able to set a watch on "infile.good()" or "infile.is_open()"? I keep getting "Error: member function not present."

и соответствующие его включают:

#include <fstream> 

и т.д.

+0

У меня есть #include в моем файле cpp. –

+0

Вам нужно показать нам полный файл, чтобы исправить вашу вторую проблему. Кстати, могли ли вы читать в файле? – dirkgently

+0

Обновлен с полным кодом. –

1

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

а) синтаксическая ошибка в «КСН :: поел || :: ИСН в» => должен быть «ИОС :: поел | ИСН :: В»

б) «ИОС :: съела» устанавливает курсор в конец файла - так что вы ничего не получите, когда вы начнете читать

так просто удалить «ИСН :: питались», и вы прекрасно :)

ciao, Chris

4

Иногда 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); 

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