Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
phobos_nik
2 / 2 / 0
Регистрация: 13.05.2011
Сообщений: 20
#1

MSVS 2012: fstream не открывает файл при дебаге - C++

23.08.2013, 14:06. Просмотров 1441. Ответов 9
Метки нет (Все метки)

Имеется простенькая программка, читающая файл input_file.txt в одной папке с экзешником и выводящая текст в консоль.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    std::ifstream input_file;
    input_file.open("input_file.txt");
    if (input_file.is_open())
    {
        while(!input_file.eof())
        {
            std::string string_in_input_file;
            std::getline(input_file, string_in_input_file);
            std::cout << string_in_input_file << std::endl;
        }
    }
    else
        std::cout << "File not found" << std::endl;
    input_file.close();
    system("pause");
    return 0;
}
Visual Studio 2012 нормально собирает данное поделие (нажатие F6) и запуск получившегося экзешника из папки "Проект" -> "Debug" приводит к вполне закономерному результату - текстовый файл успешно читается в консоль.
Если же в VS нажать F5, то поделие собирается, запускается и выдаёт в консоль "File not found". При этом путь к запускаемому экзешнику в заголовке окна открывающейся консоли вполне себе совпадает с тем, что и в предыдущем случае (якобы запуск экзешника производится из папки "Проект" -> "Debug"), но текстовый файл при этом не читается.

Собсно вопрос: как быть с дебагом самописных поделий в VS 2012? Это один я такой осчастливленный или это распространённое явление? В C#-поделиях в той же самой VS 2012 таких проблем не возникает - получившиеся экзешники ведут себя одинаково как при дебаге (нажатие F5), так и при сборке (F6) и последующем запуске из проводника.

P.S. Извиняюсь за сумбурность, если что-то из моего изложения не ясно - укажите, уточню.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2013, 14:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос MSVS 2012: fstream не открывает файл при дебаге (C++):

разобраться с ошибкой с3867 (msvs 2012) - C++
#include &quot;stdafx.h&quot; #include &quot;Menu.h&quot; #include &quot;Labs.h&quot; void Some(){std::cout&lt;&lt;&quot;спасибо что работает &quot;;_getch();} int main() ...

MSVS 2012 error LNK2019: unresolved external symbol - C++
Ребят, всем доброго вечера. Подскажите пожалуйста, в чем подвох. /// /// Common.h ...

Непонятный глюк при дебаге - C++
Курсор стоял на 200-й строке, я добавил Buffer в Watch и сразу вылезло окно call stack.

Конвертировать с MsVS 2008 в MsVS 2010 - C++
У меня есть проект на MsVS 2008. Он состоит с нескольких файлов, которые потом подключаются в основной программе. Как можно сделать чтобы...

Запись в файл fstream - C++
После первого прогона не выводит ничего из файла. void WriteInTheFile(fstream &amp;file_in) { file_in.seekg(0,file_in.end); char str;...

Fstream не видит файл - C++
Делаю лабу и возникла такая проблема - надо открыть текстовый файл. Файл лежит в одной папке c .exe . Но программа упорно не видит файл. ...

9
Убежденный
Ушел с форума
Эксперт С++
15701 / 7211 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
23.08.2013, 14:08 #2
Скорее всего, при запуске программы под отладчиком для нее устанавливается
другая текущая директория. Попробуйте вызвать в начале программы GetCurrentDirectory и
посмотрите, что она выдает при обычном запуске и под отладчиком.
1
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 14:13 #3
Цитата Сообщение от phobos_nik Посмотреть сообщение
читающая файл input_file.txt в одной папке с экзешником
Вообще-то, в студии файл должен неходиться в папке проекта (если запуск из студии делается), а не в Debug (рядом с .exe). В Debug он нужен, если запуск производится не из студии, а, непосредственно, из папки.
1
phobos_nik
2 / 2 / 0
Регистрация: 13.05.2011
Сообщений: 20
23.08.2013, 14:35  [ТС] #4
Убежденный, благодарю за ваш столь быстрый ответ.

При запуске под отладчиком выдаёт следующий путь:
\visual studio 2012\Projects\TestOpenFileInDebugCPP\TestOpenFileInDebugCPP
При обычном запуске путь следющий:
\visual studio 2012\Projects\TestOpenFileInDebugCPP\Debug

В принципе направление, над которым надо работать, понятно. Как же в VS 2012 насильно указать директорию, из которой запускается программа?

Добавлено через 3 минуты
alsav22, благодарю за ответ.

А чем вызвано такое поведение студии по отношению к консольным проектам C++? Потому что консольные проекты C# вполне себе нормально работают в отладчике с файлами из папки, соответствующей конфигурации проекта (Debug, Release) ...

Добавлено через 8 минут
alsav22, таки если текстовый файл закинуть в \visual studio 2012\Projects\TestOpenFileInDebugCPP\TestOpenFileInDebugCPP, то всё вполне себе благополучно работает и читается. ИМХО нелогично это - при отладке читать файл не из папки с экзешником (по умолчанию), а из других директорий проекта, в которых этот самый экзешник отсутствует.
1
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 14:44 #5
Может и не логично... Просто так сделано.
Цитата Сообщение от phobos_nik Посмотреть сообщение
Как же в VS 2012 насильно указать директорию, из которой запускается программа?
Можно указать, где .exe создавать. Не совсем понятно, в чём проблема? Если куда файл положить, то ведь можно в коде и полный путь к файлу указывать.
1
phobos_nik
2 / 2 / 0
Регистрация: 13.05.2011
Сообщений: 20
23.08.2013, 15:04  [ТС] #6
alsav22, скорее не проблема, а очень серьёзное неудобство. Не очевидно же, откуда подвергающаяся дебагу программа будет читать пользовательские файлы. Соответственно - совершенно различные результаты выполнения этой самой программы.
А указывать полный путь к файлу - вариант конечно действенный, но слишком уж прямолинейный - при переносе программы на другие компьютеры могут возникнуть проблемы; когда же и экзешник, и текстовик лежат в однойпапке - ИМХО всё намного проще, достаточно перекинуть только эту папку не занимаясь выращиванием деревьев подпапок.
0
Убежденный
Ушел с форума
Эксперт С++
15701 / 7211 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
23.08.2013, 15:09 #7
Цитата Сообщение от phobos_nik Посмотреть сообщение
В принципе направление, над которым надо работать, понятно. Как же в VS 2012 насильно указать директорию, из которой запускается программа?
Я предлагаю пойти другим путем - в приложении вычислять путь к папке,
из которой запущен exe, к нему добавлять имя файла. Получится полный путь.
И не будет никаких проблем.
2
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 16:30 #8
Цитата Сообщение от phobos_nik Посмотреть сообщение
alsav22, скорее не проблема, а очень серьёзное неудобство.
Согласен, но это же неудобство только для первого раза, пока не знаешь куда правильно файл положить. С полным путём и проблемой при переносе согласен.

Добавлено через 15 минут
Так сделано, кстати, не только в студии, в Code::Blocks - то же самое.

Добавлено через 19 минут
Цитата Сообщение от Убежденный Посмотреть сообщение
Я предлагаю пойти другим путем - в приложении вычислять путь к папке,
из которой запущен exe,
Как это можно сделать?
0
Убежденный
Ушел с форума
Эксперт С++
15701 / 7211 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
23.08.2013, 16:33 #9
Вызвать GetModuleFileName (hModule = NULL).
Потом обрезать путь по последнему слэшу и добавить имя файла.
1
phobos_nik
2 / 2 / 0
Регистрация: 13.05.2011
Сообщений: 20
23.08.2013, 17:19  [ТС] #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Согласен, но это же неудобство только для первого раза, пока не знаешь куда правильно файл положить.
Таки да, именно так.
Чисто для себя я уже определил костыль - для дебага из под VS 2012 кидать необходимые файлы в \Projects\TestOpenFileInDebugCPP\TestOpenFileInDebugCPP (понятное дело, что пути всё время будут разными для разных проектов), а копии этих самых файлов держать в папке, соответствующей конфигурации проекта (получится вроде как финальный вариант). Ну а за все прочие варианты решения этого затруднения также большая благодарность всем отписавшимся по существу вопроса.

Судьбу темы оставляю на усмотрение модераторов.
0
23.08.2013, 17:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2013, 17:19
Привет! Вот еще темы с ответами:

Fstream не видит файл - C++
Почему в Visual Studio2015 не находит текстовый файл, который лежит рядом с .exe? ifstream F; F.open(&quot;vacancy.txt&quot;); char...

Запись в файл fstream - C++
Вот такой вот код , изобразил я для записи переменной в файл , проблема в том , что компилятор записывает в него не 10 раз L , а ...

При выполнении фрагмента кода, в построчном дебаге студия крашится и перезагружается: найти и исправить ошибку - C++
Добрый день, не могу разобраться в чем дело. Есть следующий фрагмент кода: ListTables *searchTable =...

fstream не записывает данные в файл - C++
Если к примеру открываю файл так : fstream io; io.open(&quot;test.txt&quot;); то читает из файла хорошо, если при этом не записывать ничего....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru