Как подключить текстовый файл к проекту c
Перейти к содержимому

Как подключить текстовый файл к проекту c

  • автор:

Добавление текстового файл в проект с++

Мне необходимо добавить текстовый файл в проект в Visual Studio 2010 (проект на С++), сейчас я работаю с файлом, одержимое файла я читаю построчно и записываю туда новое значение. Файл храниться на диске D и это неудобно: при перемещении проекта необходимо перетаскивать и файл.. Глупо. Добавить в проект текстовый файл при помощи меню я могу, но #include выдает ошибку

 Cannot open include file: 'TextFile1.txt': No such file or directory 

Что делать?

Отслеживать

397 2 2 золотых знака 10 10 серебряных знаков 39 39 бронзовых знаков

Как подключить текстовый файл к проекту c

Подобно паре Directory/DirectoryInfo для работы с файлами предназначена пара классов File и FileInfo . С их помощью мы можем создавать, удалять, перемещать файлы, получать их свойства и многое другое.

FileInfo

Некоторые полезные методы и свойства класса FileInfo :

  • CopyTo(path) : копирует файл в новое место по указанному пути path
  • Create() : создает файл
  • Delete() : удаляет файл
  • MoveTo(destFileName) : перемещает файл в новое место
  • Свойство Directory : получает родительский каталог в виде объекта DirectoryInfo
  • Свойство DirectoryName : получает полный путь к родительскому каталогу
  • Свойство Exists : указывает, существует ли файл
  • Свойство Length : получает размер файла
  • Свойство Extension : получает расширение файла
  • Свойство Name : получает имя файла
  • Свойство FullName : получает полное имя файла

Для создания объекта FileInfo применяется конструктор, который получает в качестве параметра путь к файлу:

FileInfo fileInf = new FileInfo(@"C:\app\content.txt");

File

Класс File реализует похожую функциональность с помощью статических методов:

  • Copy() : копирует файл в новое место
  • Create() : создает файл
  • Delete() : удаляет файл
  • Move : перемещает файл в новое место
  • Exists(file) : определяет, существует ли файл

Пути к файлам

Для работы с файлами можно применять как абсолютные, так и относительные пути:

// абсолютные пути string path1 = @"C:\Users\eugene\Documents\content.txt"; // для Windows string path2 = "C:\\Users\\eugene\\Documents\\content.txt"; // для Windows string path3 = "/Users/eugene/Documents/content.txt"; // для MacOS/Linux // относительные пути string path4 = "MyDir\\content.txt"; // для Windows string path5 = "MyDir/content.txt"; // для MacOS/Linux

Получение информации о файле

string path = @"C:\Users\eugene\Documents\content.txt"; // string path = "/Users/eugene/Documents/content.txt"; // для MacOS/Linux FileInfo fileInfo = new FileInfo(path); if (fileInfo.Exists) < Console.WriteLine($"Имя файла: "); Console.WriteLine($"Время создания: "); Console.WriteLine($"Размер: "); >

Удаление файла

string path = @"C:\app\content.txt"; FileInfo fileInf = new FileInfo(path); if (fileInf.Exists) < fileInf.Delete(); // альтернатива с помощью класса File // File.Delete(path); >

Перемещение файла

string path = @"C:\OldDir\content.txt"; string newPath = @"C:\NewDir\index.txt"; FileInfo fileInf = new FileInfo(path); if (fileInf.Exists) < fileInf.MoveTo(newPath); // альтернатива с помощью класса File // File.Move(path, newPath); >

Если файл по новому пути уже существует, то с помощью дополнительного параметра можно указать, надо ли перезаписать файл (при значении true файл перезаписывается)

string path = @"C:\OldDir\content.txt"; string newPath = @"C:\NewDir\index.txt"; FileInfo fileInf = new FileInfo(path); if (fileInf.Exists) < fileInf.MoveTo(newPath, true); // альтернатива с помощью класса File // File.Move(path, newPath, true); >

Копирование файла

string path = @"C:\OldDir\content.txt"; string newPath = @"C:\NewDir\index2.txt"; FileInfo fileInf = new FileInfo(path); if (fileInf.Exists) < fileInf.CopyTo(newPath, true); // альтернатива с помощью класса File // File.Copy(path, newPath, true); >

Метод CopyTo класса FileInfo принимает два параметра: путь, по которому файл будет копироваться, и булевое значение, которое указывает, надо ли при копировании перезаписывать файл (если true , как в случае выше, файл при копировании перезаписывается). Если же в качестве последнего параметра передать значение false , то если такой файл уже существует, приложение выдаст ошибку.

Метод Copy класса File принимает три параметра: путь к исходному файлу, путь, по которому файл будет копироваться, и булевое значение, указывающее, будет ли файл перезаписываться.

Чтение и запись файлов

В дополнение к вышерассмотренным методам класс File также предоставляет ряд методов для чтения-записи текстовых и бинарных файлов:

  • AppendAllLines(String, IEnumerable) / AppendAllLinesAsync(String, IEnumerable, CancellationToken) добавляют в файл набор строк. Если файл не существует, то он создается
  • AppendAllText(String, String) / AppendAllTextAsync(String, String, CancellationToken) добавляют в файл строку. Если файл не существует, то он создается
  • byte[] ReadAllBytes (string path) / Task ReadAllBytesAsync (string path, CancellationToken cancellationToken) считывают содержимое бинарного файла в массив байтов
  • string[] ReadAllLines (string path) / Task ReadAllLinesAsync (string path, CancellationToken cancellationToken) считывают содержимое текстового файла в массив строк
  • string ReadAllText (string path) / Task ReadAllTextAsync (string path, CancellationToken cancellationToken) считывают содержимое текстового файла в строку
  • IEnumerable ReadLines (string path) считывают содержимое текстового файла в коллекцию строк
  • void WriteAllBytes (string path, byte[] bytes) / Task WriteAllBytesAsync (string path, byte[] bytes, CancellationToken cancellationToken) записывают массив байт в бинарный файл. Если файл не существует, он создается. Если существует, то перезаписывается
  • void WriteAllLines (string path, string[] contents) / Task WriteAllLinesAsync (string path, IEnumerable contents, CancellationToken cancellationToken) записывают массив строк в текстовый файл. Если файл не существует, он создается. Если существует, то перезаписывается
  • WriteAllText (string path, string? contents) / Task WriteAllTextAsync (string path, string? contents, CancellationToken cancellationToken) записывают строку в текстовый файл. Если файл не существует, он создается. Если существует, то перезаписывается

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

Например, запишем и считаем обратно в строку текстовый файл:

string path = @"c:\app\content.txt"; string originalText = "Hello Metanit.com"; // запись строки await File.WriteAllTextAsync(path, originalText); // дозапись в конец файла await File.AppendAllTextAsync(path, "\nHello work"); // чтение файла string fileText = await File.ReadAllTextAsync(path); Console.WriteLine(fileText);
Hello Metanit.com Hello work

Стоит отметить, что при добавлении текста я добавил в строку последовательность «\n», которая выполняет перевод на следующую строку. Благодаря этому добавляемый текст располагается в файле на новой строке.

Если мы хотим, что в файле изначально шло добавление на новую строку, то для записи стоит использовать метод WriteAllLines/ WriteAllLinesAsync , а для добавления — AppendAllLines / AppendAllLinesAsync

await File.WriteAllLinesAsync(path, new[] < "Hello Metanit.com", "Hello work" >);

Аналогично при чтении файла если мы хотим каждую строку файла считать отдельно, то вместо ReadAllText / ReadAllTextAsync применяется ReadAllLines / ReadAllLinesAsync .

Кодировка

В качестве дополнительного параметра методы чтения-записи текстовых файлов позволяют установить кодировку в виде объекта System.Text.Encoding :

using System.Text; string path = "/Users/eugene/Documents/app/content.txt"; string originalText = "Привет Metanit.com"; // запись строки await File.WriteAllTextAsync(path, originalText, Encoding.Unicode); // дозапись в конец файла await File.AppendAllTextAsync(path, "\nПривет мир", Encoding.Unicode); // чтение файла string fileText = await File.ReadAllTextAsync(path, Encoding.Unicode); Console.WriteLine(fileText);

Для установки кодировки при записи и чтении здесь применяется встроенное значение Encoding.Unicode . Также можно указать название кодировки, единственное следует удостовериться, что текущая операционная система поддерживает выбранную кодировку:

using System.Text; string path = @"c:\app\content.txt"; string originalText = "Hello Metanit.com"; // запись строки await File.WriteAllTextAsync(path, originalText, Encoding.GetEncoding("iso-8859-1")); // дозапись в конец файла await File.AppendAllTextAsync(path, "\nHello code", Encoding.GetEncoding("iso-8859-1")); // чтение файла string fileText = await File.ReadAllTextAsync(path, Encoding.GetEncoding("iso-8859-1")); Console.WriteLine(fileText);

Работа с файлами в С++

Большинство компьютерных программ работают с файлами, и поэтому возникает необходимость создавать, удалять, записывать читать, открывать файлы. Что же такое файл? Файл – именованный набор байтов, который может быть сохранен на некотором накопителе. Ну, теперь ясно, что под файлом понимается некоторая последовательность байтов, которая имеет своё, уникальное имя, например файл.txt . В одной директории не могут находиться файлы с одинаковыми именами. Под именем файла понимается не только его название, но и расширение, например: file.txt и file.dat разные файлы, хоть и имеют одинаковые названия. Существует такое понятие, как полное имя файлов – это полный адрес к директории файла с указанием имени файла, например: D:\docs\file.txt . Важно понимать эти базовые понятия, иначе сложно будет работать с файлами.

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

Файловый ввод/вывод аналогичен стандартному вводу/выводу, единственное отличие – это то, что ввод/вывод выполнятся не на экран, а в файл. Если ввод/вывод на стандартные устройства выполняется с помощью объектов cin и cout , то для организации файлового ввода/вывода достаточно создать собственные объекты, которые можно использовать аналогично операторам cin и cout .

Например, необходимо создать текстовый файл и записать в него строку Работа с файлами в С++ . Для этого необходимо проделать следующие шаги:

  1. создать объект класса ofstream ;
  2. связать объект класса с файлом, в который будет производиться запись;
  3. записать строку в файл;
  4. закрыть файл.

Почему необходимо создавать объект класса ofstream , а не класса ifstream ? Потому, что нужно сделать запись в файл, а если бы нужно было считать данные из файла, то создавался бы объект класса ifstream .

// создаём объект для записи в файл ofstream /*имя объекта*/; // объект класса ofstream

Назовём объект – fout , Вот что получится:

ofstream fout;

Для чего нам объект? Объект необходим, чтобы можно было выполнять запись в файл. Уже объект создан, но не связан с файлом, в который нужно записать строку.

fout.open("cppstudio.txt"); // связываем объект с файлом

Через операцию точка получаем доступ к методу класса open(), в круглых скобочках которого указываем имя файла. Указанный файл будет создан в текущей директории с программой. Если файл с таким именем существует, то существующий файл будет заменен новым. Итак, файл открыт, осталось записать в него нужную строку. Делается это так:

fout 

Используя операцию передачи в поток совместно с объектом fout строка Работа с файлами в С++ записывается в файл. Так как больше нет необходимости изменять содержимое файла, его нужно закрыть, то есть отделить объект от файла.

fout.close(); // закрываем файл

Итог – создан файл со строкой Работа с файлами в С++ .

Шаги 1 и 2 можно объединить, то есть в одной строке создать объект и связать его с файлом. Делается это так:

ofstream fout("cppstudio.txt"); // создаём объект класса ofstream и связываем его с файлом cppstudio.txt

Объединим весь код и получим следующую программу.

// file.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv[]) < ofstream fout("cppstudio.txt"); // создаём объект класса ofstream для записи и связываем его с файлом cppstudio.txt fout 

Осталось проверить правильность работы программы, а для этого открываем файл cppstudio.txt и смотрим его содержимое, должно быть — Работа с файлами в С++ .

Для того чтобы прочитать файл понадобится выполнить те же шаги, что и при записи в файл с небольшими изменениями:

  1. создать объект класса ifstream и связать его с файлом, из которого будет производиться считывание;
  2. прочитать файл;
  3. закрыть файл.
// file_read.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include #include using namespace std; int main(int argc, char* argv[]) < setlocale(LC_ALL, "rus"); // корректное отображение Кириллицы char buff[50]; // буфер промежуточного хранения считываемого из файла текста ifstream fin("cppstudio.txt"); // открыли файл для чтения fin >> buff; // считали первое слово из файла cout 

В программе показаны два способа чтения из файла, первый – используя операцию передачи в поток, второй – используя функцию getline() . В первом случае считывается только первое слово, а во втором случае считывается строка, длинной 50 символов. Но так как в файле осталось меньше 50 символов, то считываются символы включительно до последнего. Обратите внимание на то, что считывание во второй раз ( строка 17 ) продолжилось, после первого слова, а не с начала, так как первое слово было прочитано в строке 14 . Результат работы программы показан на рисунке 1.

CppStudio.com

Работа с файлами в С++ Для продолжения нажмите любую клавишу . . .

Рисунок 1 — Работа с файлами в С++

Программа сработала правильно, но не всегда так бывает, даже в том случае, если с кодом всё впорядке. Например, в программу передано имя несуществующего файла или в имени допущена ошибка. Что тогда? В этом случае ничего не произойдёт вообще. Файл не будет найден, а значит и прочитать его не возможно. Поэтому компилятор проигнорирует строки, где выполняется работа с файлом. В результате корректно завершится работа программы, но ничего, на экране показано не будет. Казалось бы это вполне нормальная реакции на такую ситуацию. Но простому пользователю не будет понятно, в чём дело и почему на экране не появилась строка из файла. Так вот, чтобы всё было предельно понятно в С++ предусмотрена такая функция — is_open() , которая возвращает целые значения: 1 — если файл был успешно открыт, 0 — если файл открыт не был. Доработаем программу с открытием файла, таким образом, что если файл не открыт выводилось соответствующее сообщение.

// file_read.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include #include using namespace std; int main(int argc, char* argv[]) < setlocale(LC_ALL, "rus"); // корректное отображение Кириллицы char buff[50]; // буфер промежуточного хранения считываемого из файла текста ifstream fin("cppstudio.doc"); // (ВВЕЛИ НЕ КОРРЕКТНОЕ ИМЯ ФАЙЛА) if (!fin.is_open()) // если файл не открыт cout > buff; // считали первое слово из файла cout system("pause"); return 0; >

Результат работы программы показан на рисунке 2.

CppStudio.com

Файл не может быть открыт! Для продолжения нажмите любую клавишу . . .

Рисунок 2 — Работа с файлами в С++

Как видно из рисунка 2 программа сообщила о невозможности открыть файл. Поэтому, если программа работает с файлами, рекомендуется использовать эту функцию, is_open() , даже, если уверены, что файл существует.

Режимы открытия файлов

Режимы открытия файлов устанавливают характер использования файлов. Для установки режима в классе ios_base предусмотрены константы, которые определяют режим открытия файлов (см. Таблица 1).

Таблица 1 — режимы открытия файлов

Константа Описание
ios_base::in открыть файл для чтения
ios_base::out открыть файл для записи
ios_base::ate при открытии переместить указатель в конец файла
ios_base::app открыть файл для записи в конец файла
ios_base::trunc удалить содержимое файла, если он существует
ios_base::binary открытие файла в двоичном режиме

Режимы открытия файлов можно устанавливать непосредственно при создании объекта или при вызове функции open() .

ofstream fout("cppstudio.txt", ios_base::app); // открываем файл для добавления информации к концу файла fout.open("cppstudio.txt", ios_base::app); // открываем файл для добавления информации к концу файла

Режимы открытия файлов можно комбинировать с помощью поразрядной логической операции или | , например: ios_base::out | ios_base::trunc — открытие файла для записи, предварительно очистив его.

Объекты класса ofstream , при связке с файлами по умолчанию содержат режимы открытия файлов ios_base::out | ios_base::trunc . То есть файл будет создан, если не существует. Если же файл существует, то его содержимое будет удалено, а сам файл будет готов к записи. Объекты класса ifstream связываясь с файлом, имеют по умолчанию режим открытия файла ios_base::in — файл открыт только для чтения. Режим открытия файла ещё называют — флаг, для удобочитаемости в дальнейшем будем использовать именно этот термин. В таблице 1 перечислены далеко не все флаги, но для начала этих должно хватить.

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

Разработаем программу, которая, используя операцию sizeof() , будет вычислять характеристики основных типов данных в С++ и записывать их в файл. Характеристики:

  1. число байт, отводимое под тип данных
  2. максимальное значение, которое может хранить определённый тип данных.

Запись в файл должна выполняться в таком формате:

/* data type byte max value bool = 1 255.00 char = 1 255.00 short int = 2 32767.00 unsigned short int = 2 65535.00 int = 4 2147483647.00 unsigned int = 4 4294967295.00 long int = 4 2147483647.00 unsigned long int = 4 4294967295.00 float = 4 2147483647.00 long float = 8 9223372036854775800.00 double = 8 9223372036854775800.00 */

Такая программа уже разрабатывалась ранее в разделе Типы данных С++ , но там вся информация о типах данных выводилась на стандартное устройство вывода, а нам необходимо программу переделать так, чтобы информация записывалась в файл. Для этого необходимо открыть файл в режиме записи, с предварительным усечением текущей информации файла (строка 14). Как только файл создан и успешно открыт (строки 16 — 20), вместо оператора cout , в строке 22 используем объект fout . таким образом, вместо экрана информация о типах данных запишется в файл.

// write_file.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include #include // работа с файлами #include // манипуляторы ввода/вывода using namespace std; int main(int argc, char* argv[]) < setlocale(LC_ALL, "rus"); // связываем объект с файлом, при этом файл открываем в режиме записи, предварительно удаляя все данные из него ofstream fout("data_types.txt", ios_base::out | ios_base::trunc); if (!fout.is_open()) // если файл небыл открыт < cout fout << " data type " << "byte" << " " << " max value " << endl // заголовки столбцов << "bool = " << sizeof(bool) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных bool*/ << (pow(2,sizeof(bool) * 8.0) - 1) << endl << "char = " << sizeof(char) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных char*/ << (pow(2,sizeof(char) * 8.0) - 1) << endl << "short int = " << sizeof(short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных short int*/ << (pow(2,sizeof(short int) * 8.0 - 1) - 1) << endl << "unsigned short int = " << sizeof(unsigned short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned short int*/ << (pow(2,sizeof(unsigned short int) * 8.0) - 1) << endl << "int = " << sizeof(int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных int*/ << (pow(2,sizeof(int) * 8.0 - 1) - 1) << endl << "unsigned int = " << sizeof(unsigned int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned int*/ << (pow(2,sizeof(unsigned int) * 8.0) - 1) << endl << "long int = " << sizeof(long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных long int*/ << (pow(2,sizeof(long int) * 8.0 - 1) - 1) << endl << "unsigned long int = " << sizeof(unsigned long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных undigned long int*/ << (pow(2,sizeof(unsigned long int) * 8.0) - 1) << endl << "float = " << sizeof(float) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных float*/ << (pow(2,sizeof(float) * 8.0 - 1) - 1) << endl << "long float = " << sizeof(long float) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных long float*/ << (pow(2,sizeof(long float) * 8.0 - 1) - 1) << endl << "double = " << sizeof(double) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных double*/ << (pow(2,sizeof(double) * 8.0 - 1) - 1) << endl; fout.close(); // программа больше не использует файл, поэтому его нужно закрыть cout

Нельзя не заметить, что изменения в программе минимальны, а всё благодаря тому, что стандартный ввод/вывод и файловый ввод/вывод используются абсолютно аналогично. В конце программы, в строке 45 мы явно закрыли файл, хотя это и не обязательно, но считается хорошим тоном программирования. Стоит отметить, что все функции и манипуляторы используемые для форматирования стандартного ввода/вывода актуальны и для файлового ввода/вывода. Поэтому не возникло никаких ошибок, когда оператор cout был заменён объектом fout .

Visual Studio. Как добавить .txt файл?

Задача:
Есть проект, в него надо добавить текстовый файл(Readme.txt) и, соответственно, заполнить его. Что-то не могу догнать, можно ли это сделать средствами такого распиаренного Visual Studio(до этого сидел на Rider, там это делается в 2 клика - ПКМ->добавить файл).

  • Вопрос задан более трёх лет назад
  • 9106 просмотров

Комментировать

Решения вопроса 1

Rem_u

Эх, как же хочется худенькую, бледную, не очень.

ПКМ пр проекту - добавить - создать элемент - текстовый файл. он будет лежать в C:\Users\User\source\repos\WindowsFormsApp1\WindowsFormsApp1 где и папка bin (это всё по стандарту) полный путь, содержание, настройка отношения файла к процессам сборки и внедрения, имя файла и ещё 2 пункта можно изменить в самом Visual Studio.

Ответ написан более трёх лет назад

Комментировать

Нравится Комментировать

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *