Открыть файл по его полному пути в C++

Я хочу, чтобы пользователь указал мне полный путь к файлу, а не только имя файла. Как открыть файл таким образом?

Это что-то вроде этого:

ifstream file;
file.open("C:/Demo.txt", ios::in);

Это не работает.


person Community    schedule 09.05.2009    source источник
comment
Откуда ты знаешь, что это не работает? Это, безусловно, должно быть сделано.   -  person    schedule 09.05.2009
comment
@DanielEarwicker, ты ошибаешься, это правильно. Если вы все равно хотите преобразовать его, вы должны преобразовать его в \\ не \   -  person Validus Oculus    schedule 04.03.2015


Ответы (5)


Обычно в качестве разделителя пути в Windows используется символ обратной косой черты. Так:

ifstream file;
file.open("C:\\Demo.txt", ios::in);

Имейте в виду, что при написании исходного кода C++ вы должны использовать двойную обратную косую черту, потому что сам символ обратной косой черты означает что-то особенное внутри строк с двойными кавычками. Таким образом, приведенное выше относится к файлу C:\Demo.txt.

person Greg Hewgill    schedule 09.05.2009
comment
Все компиляторы Windows, о которых я знаю, поддерживают использование косой черты в именах файлов, и для переносимости ее следует использовать вместо обратной косой черты. - person ; 09.05.2009
comment
Win32 поддерживает либо \, либо / для путей, если только вы не обходите канонизацию пути (пути, начинающиеся с \\?\). См. msdn.microsoft.com/en-us/library/ aa365247(VS.85).aspx - person Richard; 09.05.2009
comment
Нил, это не имеет ничего общего с компилятором. Оболочка Windows обрабатывает прямую косую черту так же, как обратную косую черту. Так было с первых дней NT. - person shoosh; 09.05.2009
comment
Оболочка Windows (если под этим вы подразумеваете cmd.exe) здесь никоим образом не задействована. - person ; 09.05.2009
comment
Это даже не имеет ничего общего с оболочкой, это зависит от ядра (Ричард прав). Я сказал «нормально», потому что вы все еще можете столкнуться с проблемами при использовании косой черты, потому что некоторые программы интерпретируют аргументы, начинающиеся с косой черты, как параметры командной строки, а не имена файлов. Вы правы, что для открытия файлов подойдет как прямая, так и обратная косая черта. Соглашение предпочитает обратную косую черту. - person Greg Hewgill; 09.05.2009

Вы можете использовать полный путь с классами fstream. Следующий код пытается открыть файл demo.txt в корне диска C:. Обратите внимание, что поскольку это операция ввода, файл уже должен существовать.

#include <fstream>
#include <iostream>
using namespace std;

int main() {
   ifstream ifs( "c:/demo.txt" );       // note no mode needed
   if ( ! ifs.is_open() ) {                 
      cout <<" Failed to open" << endl;
   }
   else {
      cout <<"Opened OK" << endl;
   }
}

Что этот код производит в вашей системе?

person Community    schedule 09.05.2009

Код кажется мне рабочим. Я думаю то же самое с @Iothar.

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

Чтобы сделать перекрестную проверку, проверьте, можете ли вы открыть его с помощью fopen..

FILE *f = fopen("C:/Demo.txt", "r");
if (f)
  printf("fopen success\n");
person phoad    schedule 17.02.2011

Для тех, кто получает путь динамически... например. перетащите:

Некоторые основные конструкции получают файл drag&drop с двойными кавычками, например:

"C:\MyPath\MyFile.txt"

Быстрое и приятное решение - использовать эту функцию для удаления символов из строки:

void removeCharsFromString( string &str, char* charsToRemove ) {
   for ( unsigned int i = 0; i < strlen(charsToRemove); ++i ) {
      str.erase( remove(str.begin(), str.end(), charsToRemove[i]), str.end() );
   }
} 

string myAbsolutepath; //fill with your absolute path
removeCharsFromString( myAbsolutepath, "\"" );

myAbsolutepath теперь содержит только C:\MyPath\MyFile.txt

Функции нужны эти библиотеки: <iostream> <algorithm> <cstring>.
Эта функция основана на этом ответе.

Рабочая скрипта: http://ideone.com/XOROjq

person jave.web    schedule 02.04.2015

Другой взгляд на этот вопрос, который может кому-то помочь:

Я пришел сюда, потому что занимался отладкой в ​​Visual Studio в Windows и запутался во всем этом обсуждении / и \\ (в большинстве случаев это не имеет значения).

Для меня проблема заключалась в том, что текущий каталог не был установлен в соответствии с тем, что я хотел в Visual Studio. По умолчанию это каталог исполняемого файла (в зависимости от того, как вы настроили свой проект).

Измените его: Щелкните правой кнопкой мыши решение -> Свойства -> Рабочий каталог.

Я упоминаю об этом только потому, что вопрос кажется ориентированным на Windows, что обычно также означает ориентированность на VisualStudio, что говорит мне, что этот совет может быть актуальным (:

person jwd    schedule 15.07.2020