Запись файла по определенному пути в С++

Вопрос:У меня есть этот код, который успешно записывает файл: ofstream outfile (path); outfile.write(buffer,size); outfile.flush(); outfile.close(); Буфер и размер в порядке остального кода. Как можно поместить файл в определенный путь? Лучший ответ: Укажите полный путь в конструкторе потока, это может быть абсолютный путь или относительный путь. (относительно того, где выполняется программа. Деструктор потоков закрывает файл для

Вопрос:

У меня есть этот код, который успешно записывает файл:

ofstream outfile (path); outfile.write(buffer,size); outfile.flush(); outfile.close();

Буфер и размер

в порядке остального кода.
Как можно поместить файл в определенный путь?

Лучший ответ:

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

Деструктор потоков закрывает файл для вас, явные закрытия MORE могут ввести ошибки (запись после закрытия файла).

#include <fstream> #include <string> int main() { const char *path=»/home/user/file.txt»; std::ofstream file(path); //open in constructor std::string data(«data to write to file»); file << data; }//file destructor

Обратите внимание, что вы можете использовать std::string в конструкторе файлов в С++ 11 и в большинстве случаев предпочитаете const char *.

Ответ №1Содержание

  1. Обоснование отправки другого ответа
  2. Быстрый обзор путей
  3. Решение проблемы путем манипуляции с трафиком
  4. Стратегии обработки путей
  5. 1. Избегайте манипуляции целиком
  6. 2. Документируйте функции, которые ваша программа использует для управления путями
  7. 3. Поддерживать только ограниченный набор путей
  8. 4. Игнорировать проблемы
  9. Закрытие мысли

Обоснование отправки другого ответа

Я отправляю сообщения, потому что ни один из других ответов не охватывает проблемное пространство.

Ответ на ваш вопрос зависит от того, как вы получите путь. Если вы строите путь полностью в своем приложении, то см. Ответ от @James Kanze. Однако, если вы читаете путь или компоненты пути из среды, в которой работает ваша программа (например, переменная среды, командная строка, файлы конфигурации и т.д.), Тогда решение отличается. Чтобы понять, почему, нам нужно определить, что такое путь.

Быстрый обзор путей

В операционных системах (о которых я знаю) путь – это строка, которая соответствует мини-языку, указанному операционной системой и файловой системой (короткая система). Пути могут предоставляться для функций ввода-вывода в заданной системе, чтобы получить доступ к некоторому ресурсу. Например, вот несколько путей, которые могут возникнуть в Windows:

file.txt \bobadmin$file.txt C:..file.txt \?C:file.txt .././file.txt \.PhysicalDisk1bob.txt \;WebDavRedirectorbob.comxyz C:PROGRA~1bob.txt .A:B

Решение проблемы путем манипуляции с трафиком

Представьте себе следующий сценарий: ваша программа поддерживает аргумент командной строки —output-path=<path>, который позволяет пользователям указывать путь, в котором ваша программа должна создавать выходные файлы. Решение для создания файлов в указанном каталоге:

  • Проанализируйте указанный пользователем путь на основе мини-языка для системы, в которой вы работаете.
  • Создайте новый путь на мини-языке, который указывает правильное местоположение для записи файла с использованием имени файла и информации, которую вы проанализировали на шаге 1.
  • Откройте файл, используя путь, сгенерированный на шаге 2.

Пример этого:

В Linux, скажем, пользователь указал —output-path=/dir1/dir2

Разберите этот мини-язык:

/dir1/dir2 —> «/» root —> «dir1» directory under root —> «/» path seperator —> «dir2» directory under dir1

Затем, когда мы хотим вывести файл в указанный каталог, мы создаем новый путь. Например, если мы хотим вывести файл с именем bob.txt, мы можем построить следующий путь:

/dir1/dir2/bob.txt —> «/» root —> «dir1» directory under root —> «/» path separator —> «dir2» directory under dir1 —> «/» path seperator —> «bob.txt» file in directory dir2

Мы можем использовать этот новый путь для создания файла.

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

Стратегии обработки путей

1. Избегайте манипуляции целиком

Не пытайтесь манипулировать путями, которые вводятся в вашу программу. Вы должны передать эти строки непосредственно в функции api, которые могут обрабатывать их правильно. Это означает, что вам нужно использовать специфичные для ОС api, избегая при этом абстракций IO С++ файла (или вам нужно быть абсолютно уверенными, как эти абстракции реализуются в каждой ОС). Обязательно тщательно разработайте интерфейс для своей программы, чтобы избежать ситуации, когда вы можете быть вынуждены манипулировать путями. Попробуйте реализовать алгоритмы для вашей программы, чтобы избежать необходимости управлять путями. Документируйте функции api, которые ваша программа использует для каждой ОС для пользователя. Это связано с тем, что сами функции api OS становятся устаревшими с течением времени, поэтому в будущем ваша программа может быть несовместима со всеми возможными путями, даже если вы стараетесь избегать манипуляций с трафиком.

2. Документируйте функции, которые ваша программа использует для управления путями

Документировать пользователю, как будут обрабатываться пути. Затем дайте понять, что ответственность пользователей заключается в том, чтобы указать пути, которые будут корректно работать с документированным поведением программы.

3. Поддерживать только ограниченный набор путей

Ограничьте мини-языки пути, которые ваша программа примет, пока не убедитесь, что вы можете правильно манипулировать подмножеством путей, соответствующих этому набору ограничений. Документируйте это для пользователя. Ошибка ввода входных данных, которые не соответствуют.

4. Игнорировать проблемы

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

Закрытие мысли

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

Ответ №2

Это нужно сделать при открытии файла, см. std::ofstream конструктор или open().

Ответ №3

Не слишком понятно, что вы просите; если я правильно понимаю, вы
заданное имя файла, и вы хотите создать файл в определенном
каталог. Если это так, все, что необходимо, – это указать
завершите путь к конструктору ofstream. Вы можете использовать строку
конкатенация, чтобы создать этот путь, но я настоятельно рекомендую
boost::filesystem::path. У этого есть все функции, чтобы сделать это
портативно и многое другое; в противном случае вы не будете переносимыми (без
много усилий), и даже простые операции с именем файла потребуют
значительная мысль.

Ответ №4

Я застрял на этом некоторое время и с тех пор понял это. Путь основан на том, где ваш исполняемый файл и немного отличается. В этом примере предположим, что вы выполняете ls в вашем исполняемом каталоге и смотрите:

myprogram.out Saves

Где Saves – это папка, а myprogram.out – это программа, в которой вы работаете.

В вашем коде, если вы конвертируете символы в c_str() следующим образом:

string file; getline(cin, file, ‘n’); ifstream thefile; thefile.open( («Saves/» + file + «.txt»).c_str() );

и пользовательский тип в файле savefile будет

«Saves/savefile.txt»

который будет работать, чтобы добраться до файла savefile.txt в папке Saves. Обратите внимание, что нет предварительных сокращений, и вы начинаете с имени папки.

Однако, если вы используете строковый литерал, например

ifstream thefile; thefile.open(«./Saves/savefile.txt»);

было бы так, чтобы попасть в ту же папку:

«./Saves/savefile.txt»

Обратите внимание, что вы начинаете с ./ перед именем папки.

Ответ №5

Попробуйте следующее:

ofstream outfile; string createFile = «»; string path=»/FULL_PATH»; createFile = path.as<string>() + «/» + «SAMPLE_FILENAME» + «.txt»; outfile.open(createFile.c_str()); outfile.close(); //It works like a charm. Ответ №6

Если вы используете linux, попробуйте execl(), с командой mv.

Оцените статью
Добавить комментарий