Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
phobos_nik
 Аватар для phobos_nik
2 / 2 / 0
Регистрация: 13.05.2011
Сообщений: 20
23.08.2013, 14:06     MSVS 2012: fstream не открывает файл при дебаге #1
Имеется простенькая программка, читающая файл 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. Извиняюсь за сумбурность, если что-то из моего изложения не ясно - укажите, уточню.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2013, 14:06     MSVS 2012: fstream не открывает файл при дебаге
Посмотрите здесь:

C++ Запись в файл fstream
C++ Конвертировать с MsVS 2008 в MsVS 2010
C++ Программа при релизе не работает, а при дебаге работает
разобраться с ошибкой с3867 (msvs 2012) C++
Непонятный глюк при дебаге C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14216 / 6231 / 988
Регистрация: 02.05.2013
Сообщений: 10,390
Завершенные тесты: 1
23.08.2013, 14:08     MSVS 2012: fstream не открывает файл при дебаге #2
Скорее всего, при запуске программы под отладчиком для нее устанавливается
другая текущая директория. Попробуйте вызвать в начале программы GetCurrentDirectory и
посмотрите, что она выдает при обычном запуске и под отладчиком.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 14:13     MSVS 2012: fstream не открывает файл при дебаге #3
Цитата Сообщение от phobos_nik Посмотреть сообщение
читающая файл input_file.txt в одной папке с экзешником
Вообще-то, в студии файл должен неходиться в папке проекта (если запуск из студии делается), а не в Debug (рядом с .exe). В Debug он нужен, если запуск производится не из студии, а, непосредственно, из папки.
phobos_nik
 Аватар для phobos_nik
2 / 2 / 0
Регистрация: 13.05.2011
Сообщений: 20
23.08.2013, 14:35  [ТС]     MSVS 2012: fstream не открывает файл при дебаге #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, то всё вполне себе благополучно работает и читается. ИМХО нелогично это - при отладке читать файл не из папки с экзешником (по умолчанию), а из других директорий проекта, в которых этот самый экзешник отсутствует.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 14:44     MSVS 2012: fstream не открывает файл при дебаге #5
Может и не логично... Просто так сделано.
Цитата Сообщение от phobos_nik Посмотреть сообщение
Как же в VS 2012 насильно указать директорию, из которой запускается программа?
Можно указать, где .exe создавать. Не совсем понятно, в чём проблема? Если куда файл положить, то ведь можно в коде и полный путь к файлу указывать.
phobos_nik
 Аватар для phobos_nik
2 / 2 / 0
Регистрация: 13.05.2011
Сообщений: 20
23.08.2013, 15:04  [ТС]     MSVS 2012: fstream не открывает файл при дебаге #6
alsav22, скорее не проблема, а очень серьёзное неудобство. Не очевидно же, откуда подвергающаяся дебагу программа будет читать пользовательские файлы. Соответственно - совершенно различные результаты выполнения этой самой программы.
А указывать полный путь к файлу - вариант конечно действенный, но слишком уж прямолинейный - при переносе программы на другие компьютеры могут возникнуть проблемы; когда же и экзешник, и текстовик лежат в однойпапке - ИМХО всё намного проще, достаточно перекинуть только эту папку не занимаясь выращиванием деревьев подпапок.
Убежденный
Системный программист
 Аватар для Убежденный
14216 / 6231 / 988
Регистрация: 02.05.2013
Сообщений: 10,390
Завершенные тесты: 1
23.08.2013, 15:09     MSVS 2012: fstream не открывает файл при дебаге #7
Цитата Сообщение от phobos_nik Посмотреть сообщение
В принципе направление, над которым надо работать, понятно. Как же в VS 2012 насильно указать директорию, из которой запускается программа?
Я предлагаю пойти другим путем - в приложении вычислять путь к папке,
из которой запущен exe, к нему добавлять имя файла. Получится полный путь.
И не будет никаких проблем.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2013, 16:30     MSVS 2012: fstream не открывает файл при дебаге #8
Цитата Сообщение от phobos_nik Посмотреть сообщение
alsav22, скорее не проблема, а очень серьёзное неудобство.
Согласен, но это же неудобство только для первого раза, пока не знаешь куда правильно файл положить. С полным путём и проблемой при переносе согласен.

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

Добавлено через 19 минут
Цитата Сообщение от Убежденный Посмотреть сообщение
Я предлагаю пойти другим путем - в приложении вычислять путь к папке,
из которой запущен exe,
Как это можно сделать?
Убежденный
Системный программист
 Аватар для Убежденный
14216 / 6231 / 988
Регистрация: 02.05.2013
Сообщений: 10,390
Завершенные тесты: 1
23.08.2013, 16:33     MSVS 2012: fstream не открывает файл при дебаге #9
Вызвать GetModuleFileName (hModule = NULL).
Потом обрезать путь по последнему слэшу и добавить имя файла.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2013, 17:19     MSVS 2012: fstream не открывает файл при дебаге
Еще ссылки по теме:

C++ MSVS 2012 error LNK2019: unresolved external symbol
C++ Fstream не видит файл
C++ Запись в файл fstream

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

Или воспользуйтесь поиском по форуму:
phobos_nik
 Аватар для phobos_nik
2 / 2 / 0
Регистрация: 13.05.2011
Сообщений: 20
23.08.2013, 17:19  [ТС]     MSVS 2012: fstream не открывает файл при дебаге #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Согласен, но это же неудобство только для первого раза, пока не знаешь куда правильно файл положить.
Таки да, именно так.
Чисто для себя я уже определил костыль - для дебага из под VS 2012 кидать необходимые файлы в \Projects\TestOpenFileInDebugCPP\TestOpenFileInDebugCPP (понятное дело, что пути всё время будут разными для разных проектов), а копии этих самых файлов держать в папке, соответствующей конфигурации проекта (получится вроде как финальный вариант). Ну а за все прочие варианты решения этого затруднения также большая благодарность всем отписавшимся по существу вопроса.

Судьбу темы оставляю на усмотрение модераторов.
Yandex
Объявления
23.08.2013, 17:19     MSVS 2012: fstream не открывает файл при дебаге
Ответ Создать тему
Опции темы

Текущее время: 18:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru