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

Как записать данные в файл c

  • автор:

Запись в файл на языке программирования C

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

Открытие файла для записи

Перед тем, как начать запись данных в файл, необходимо открыть файл для записи. Для этого используется функция fopen() с параметром «w» в качестве режима открытия. Режим «w» означает создание файла, если он не существует, или его перезапись, если файл уже существует.

#include int main() < FILE *file; file = fopen("example.txt", "w"); if (file == NULL) < printf("Не удалось открыть файл"); return 1; >// Здесь можно производить запись данных в файл fclose(file); return 0; > 

В приведенном выше примере создается файл с именем «example.txt» и открывается для записи. Если файл не существует, он будет создан. Если файл уже существует, его содержимое будет удалено. В случае ошибки при открытии файла, функция fopen() возвращает значение NULL. Поэтому необходимо проверить, удалось ли открыть файл, и выполнить соответствующие действия в случае ошибки.

Запись данных в файл

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

Запись строки в файл

Для записи строки в файл используется функция fputs(). Она принимает два параметра: указатель на строку и указатель на файл.

#include int main() < FILE *file; file = fopen("example.txt", "w"); if (file == NULL) < printf("Не удалось открыть файл"); return 1; >char str[] = "Пример записи строки в файл"; fputs(str, file); fclose(file); return 0; > 

В приведенном выше примере строка «Пример записи строки в файл» будет записана в файл «example.txt». Файл должен быть открыт в режиме записи.

Запись символа в файл

Для записи символа в файл используется функция fputc(). Она принимает два параметра: символ и указатель на файл.

#include int main() < FILE *file; file = fopen("example.txt", "w"); if (file == NULL) < printf("Не удалось открыть файл"); return 1; >char ch = 'A'; fputc(ch, file); fclose(file); return 0; > 

В приведенном выше примере символ ‘A’ будет записан в файл «example.txt». Файл должен быть открыт в режиме записи.

Запись числа в файл

Для записи числа в файл можно воспользоваться функцией fprintf(), которая позволяет форматированную запись данных. Она принимает три параметра: указатель на файл, формат строки и список аргументов.

#include int main() < FILE *file; file = fopen("example.txt", "w"); if (file == NULL) < printf("Не удалось открыть файл"); return 1; >int num = 123; fprintf(file, "Число: %d", num); fclose(file); return 0; > 

В приведенном выше примере число 123 будет записано в файл «example.txt» вместе с текстом «Число: «. Файл должен быть открыт в режиме записи.

Закрытие файла

После завершения записи данных в файл необходимо закрыть файл с помощью функции fclose(). Это важный шаг, так как он освобождает ресурсы, связанные с файлом, и гарантирует сохранение данных.

#include int main() < FILE *file; file = fopen("example.txt", "w"); if (file == NULL) < printf("Не удалось открыть файл"); return 1; >// Здесь можно производить запись данных в файл fclose(file); return 0; > 

В приведенном выше примере файл «example.txt» будет закрыт после записи данных. Функция fclose() возвращает 0 в случае успешного закрытия файла и EOF в случае ошибки.

Заключение

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

Как записать и считать структуру в файл на СИ

Всем добрый вечер, такая проблема, записываю структуру в файл, но при следующем запуске и чтении из файла, программа перестает работать. Также при удаление строчки 114 и 115 программа перестает работать, может кто подсказать почему?

#include #include #include #include using namespace std; typedef struct _date < int num; char* month; int year; >date; typedef struct _fio < char* fam; //Фамилия char* name; //Имя char* father; //отчество >fio; struct _deposid < int countName; fio client; date date; double sum; >; // Функция вывода счета void printClient(_deposid &client) < cout void sumLarge(_deposid *clients, int thisClient, int needSum, int countSum) < for (int i = 0; i < thisClient; i++ ) < if (clients[i].sum >needSum) < printClient(clients[i]); countSum++; >> if (countSum == 0) < cout countSum = 0; > void printNameLastname(_deposid *clients, int thisClient, char *firstname, char *lastname, char *father, int countSum) < for (int i = 0; i < thisClient; i++ ) < if (strcmp(clients[i].client.name, firstname) == 0 && strcmp(clients[i].client.fam, lastname) == 0 && strcmp(clients[i].client.father, father) == 0) < printClient(clients[i]); countSum++; >> if (countSum == 0) < cout countSum = 0; > // Функция создания нового клиента void newClient(_deposid &client) < char *userLastname = new char[100], *userFirstname = new char[100], *userFather = new char[100], *userMonth = new char[100]; // Ввод данных cout > userFirstname; client.client.name = new char[strlen(userFirstname)+1]; strcpy(client.client.name, userFirstname); cout > userLastname; client.client.fam = new char[strlen(userLastname)+1]; strcpy(client.client.fam, userLastname); cout > userFather; client.client.father = new char[strlen(userFather)+1]; strcpy(client.client.father, userFather); cout > client.date.num; cout > userMonth; client.date.month = new char[strlen(userMonth)+1]; strcpy(client.date.month, userMonth); cout > client.date.year; cout > client.sum; // Очистка памяти delete [] userLastname; delete [] userFirstname; > int main() < char *lastname = new char[100], *firstname = new char[100], *father = new char[100]; int n, thisClient = 0, numberFunction = 0, needSum, countSum = 0; _deposid *clients; char c; FILE *fp; fp=fopen("t.txt", "r+"); if (fp==NULL) < fclose(fp); fp=fopen("t.txt", "w+"); cout > n; clients = new _deposid[n]; // Создание массива структур > else < while((c = fgetc(fp)) != EOF) // При удалении этой и строчки ниже программа вообще не запускается putchar(c); while(fread(clients, sizeof(_deposid),1,fp)); // fputs("lol", fp); // fclose(fp); >cout > numberFunction; switch (numberFunction) < case 1: if (thisClient == n) < cout else < clients[thisClient].countName = thisClient + 1; newClient(clients[thisClient]); cout break; case 2: cout break; case 3: // Вывод счетов с суммой большей заданной cout > needSum; cout > firstname; cout > lastname; cout > father; cout > > 

Вот задание

Отслеживать
задан 16 мая 2022 в 11:18
егор виктуров егор виктуров
3 2 2 бронзовых знака

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

В принципе всё просто. Вы в файл сохраняете не все данные.

 case 5: cout  

Когда вы так пишете, в файл сохраняется сама структура. Т.е. в файл сохраняются не текстовые данные, кот. вы записывали в выделяемые через new буферы, а просто значение указателей char* month; и char* fam; char* name; char* father; . Для примера, проверьте значение sizeof(_deposid) - в размере структуры не будет размера того текста (фамилии, имени, отчества, названия месяца), которые вы вводили с клавиатуры.
А потом Вы загружаете из файла значение указателей, которые указывают в "никуда". Вам нужно написать свою функцию вывода Вашей структуры в файл. И свою функцию загрузки структуры из файла.
Существуют уже готовые библиотеки сериализации (вывода в поток и загрузки из потоков) объектов. Но для этой задачи проще написать свои функции.
Совет - каждое поле пишите отдельной строкой и считывайте построчно - так будет проще.
Ну и вот этот кусок:

 fp=fopen("t.txt", "r+"); if (fp==NULL) < clients = new _deposid[n]; // Создание массива структур >else < while((c = fgetc(fp)) != EOF) // При удалении этой и строчки ниже программа вообще не запускается putchar(c); while(fread(clients, sizeof(_deposid),1,fp)); 

Как правильно написал @JohnDoe выделение памяти под массив структур делается только если файла не существует. Если он существует, память под массив не выделяется. И дальше у Вас 2 ошибки, первая из которых не дает состояться второй. Вторая ошибка - запись данных в невыделенную область памяти:

fread(clients, sizeof(_deposid),1,fp) 

Здесь для clients память не выделена! А Вы пытаетесь записать туда что-то!
А первая ошибка не дает случиться второй - вот этими строками вы считываете весь файл.

while((c = fgetc(fp)) != EOF) putchar(c); 

Дескриптор файла указывает на конец файла. Функция fread() не может ничего считать из файла и поэтому ничего не записывает в невыделенную память.
По вашей логике при записи массива структур в файл вам нужно сначала записать туда количество объектов в массиве, а потом - сами объекты. И считывать в таком же порядке:

  • считать количество объектов,
  • выделить под них память,
  • считать сами объекты
    Ещё один момент:
void newClient(_deposid &client) < char *userLastname = new char[100], *userFirstname = new char[100], *userFather = new char[100], *userMonth = new char[100]; . delete [] userLastname; delete [] userFirstname; 

Выделили 4 массива, а освободили только 2. А в main() выделили и вообще не освободили. И зачем выделение через new() , если вы знаете размер буферов? Только чтобы память на куче была выделена? Стек выдержит ваши 400 байт, сделайте проще:

void newClient(_deposid &client)

Как записать массив чисел в файл?

Новичок в Си, не могу никак разобраться как записать массив обычных int'ов в файл.

Отслеживать

задан 21 мая 2020 в 9:28

45 2 2 серебряных знака 7 7 бронзовых знаков

Файл текстовый или бинарный?

21 мая 2020 в 9:48

создать массив -> открыть файл -> построчно записать массив в файл

21 мая 2020 в 11:11

@finally, это только для текстового представления возможно.

23 мая 2020 в 11:39

@0andriy так автор не уточнил, какой это файл

25 мая 2020 в 19:39

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

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

#include #include #define LEN 10 //длина массива на запись и чтение int main() < FILE *file = NULL; //указатель int len = LEN; //число элементов массива int ArrOut[LEN] = ; file = fopen("output.bin", "wb"); //wb - флаг на запись бинарного файла if (file == NULL) < //если нельзя создать или открыть printf("Error"); getchar(); return 1; >//записываем число элементов в массиве (для его чтения далее) fwrite(&len, sizeof(int), 1, file); /* &ArrOut - ссылка на массив, sizeof(int) - размер одного элемента, * len- кол-во элементов на запись, file - указатель на файл */ fwrite(ArrOut, sizeof(int), len, file); //запись самого массива printf("Запись: %d\n", len); fclose(file); //закрываем файл /***************/ FILE *Read = fopen("output.bin", "rb"); //rb - флаг на чтение бинарного файла if (Read == NULL) < //если нельзя открыть printf("Error"); getchar(); return 1; >int lenRead; //здесь будет храниться число элементов для чтения в файле fread(&lenRead, sizeof(int), 1, Read); //выделяем память под массив для чтения int *ArrIn = (int*) malloc(lenRead*sizeof(int)); //читаем данные fread(ArrIn, sizeof(int), lenRead, Read); fclose(Read); //закрываем файл printf("Кол-во элементов прочитано: %d \n", lenRead); printf("Массив: "); for(int i = 0; i < lenRead; i++) printf("%d ",ArrIn[i]); free(ArrIn); //освобождаем память getchar(); return 0; >

Как записать данные в файл c

Потоки для работы с текстовыми файлами представляют объекты, для которых не задан режим открытия ios::binary .

Запись в файл

Для записи в файл к объекту ofstream или fstream применяется оператор
#include #include int main() < std::ofstream out; // поток для записи out.open("hello.txt"); // открываем файл для записи if (out.is_open()) < out out.close(); std::cout

Здесь предполагается, что файла "hello.txt" располагается в одной папке с файлом программы. Данный способ перезаписывает файл заново. Если надо дозаписать текст в конец файла, то для открытия файла нужно использовать режим ios::app :

std::ofstream out("hello.txt", std::ios::app); if (out.is_open()) < out out.close();

Чтение из файла

Если надо считать всю строку целиком или даже все строки из файла, то лучше использовать встроенную функцию getline() , которая принимает поток для чтения и переменную, в которую надо считать текст:

#include #include #include // для std::getline int main() < std::string line; std::ifstream in("hello.txt"); // окрываем файл для чтения if (in.is_open()) < while (std::getline(in, line)) < std::cout > in.close(); // закрываем файл >

Также для чтения данных из файла для объектов ifstream и fstream может применяться оператор >> (также как и при чтении с консоли):

#include #include #include struct Point < Point(double x, double y): x, y <> double x; double y; >; int main() < std::vectorpoints< Point, Point, Point>; std::ofstream out("points.txt"); if (out.is_open()) < // записываем все объекты Point в файл for (const Point& point: points) < out > out.close(); std::vector new_points; std::ifstream in("points.txt"); // окрываем файл для чтения if (in.is_open()) < double x, y; while (in >> x >> y) < new_points.push_back(Point); > > in.close(); for (const Point& point: new_points) < std::cout >

Здесь вектор структур Point записывается в файл.

for (const Point& point: points)

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

0 0 4 5 -5 7

Используя оператор >>, можно считать последовательно данные в переменные x и y и ими инициализировать структуру.

double x, y; while (in >> x >> y) < new_points.push_back(Point); >

Но стоит отметить, что это ограниченный способ, поскольку при чтении файла поток in использует пробел для отделения одного значения от другого и таким образом считывает эти значения в переменные x и y. Если же нам надо записать и затем считать строку, которая содержит пробелы, и какие-то другие данные, то такой способ, конечно, не сработает.

  • Глава 1. Введение в С++
    • Язык программирования С++
    • Первая программа на Windows. Компилятор g++
    • Первая программа на Windows. Компилятор Clang
    • Первая программа на Windows. Компилятор Microsoft Visual C++
    • Первая программа на Linux. Компилятор g++
    • Первая программа на MacOS. Компилятор Clang
    • Настройка параметров компиляции
    • Локализация и кириллица в консоли
    • Структура программы
    • Переменные
    • Типы данных
    • Константы
    • Ввод и вывод в консоли
    • using. Подключение пространств имен и определение псевдонимов
    • Арифметические операции
    • Статическая типизация и преобразования типов
    • Поразрядные операции
    • Операции присваивания
    • Условные выражения
    • Конструкция if-else и тернарный оператор
    • Конструкция switch-case
    • Циклы
    • Ссылки
    • Массивы
    • Многомерные массивы
    • Массивы символов
    • Введение в строки
    • Что такое указатели
    • Операции с указателями
    • Арифметика указателей
    • Константы и указатели
    • Указатели и массивы
    • Определение и объявление функций
    • Область видимости объектов
    • Параметры функции
    • Передача аргументов по значению и по ссылке
    • Константные параметры
    • Оператор return и возвращение результата
    • Указатели в параметрах функции
    • Массивы в параметрах функции
    • Параметры функции main
    • Возвращение указателей и ссылок
    • Перегрузка функций
    • Рекурсивные функции
    • Рекурсия на примере быстрой сортировки
    • Указатели на функции
    • Указатели на функции как параметры
    • Тип функции
    • Указатель на функцию как возвращаемое значение
    • Разделение программы на файлы
    • Внешние объекты
    • Динамические объекты
    • Динамические массивы
    • unique_ptr
    • shared_ptr
    • Определение классов
    • Конструкторы и инициализация объектов
    • Управление доступом. Инкапсуляция
    • Объявление и определение функций класса
    • Конструктор копирования
    • Константные объекты и функции
    • Ключевое слово this
    • Дружественные функции и классы
    • Статические члены класса
    • Деструктор
    • Структуры
    • Перечисления
    • Наследование
    • Управление доступом в базовых и производных классах
    • Скрытие функционала базового класса
    • Множественное наследование
    • Виртуальные функции и их переопределение
    • Преобразование типов
    • Динамическое преобразование
    • Особенности динамического связывания
    • Чистые виртуальные функции и абстрактные классы
    • Перегрузка операторов
    • Операторы преобразования типов
    • Оператор индексирования
    • Переопределение оператора присваивания
    • Пространства имен
    • Вложенные классы
    • Обработка исключений
    • Вложенные try-catch
    • Создание своих типов исключений
    • Тип exception
    • Типы исключений
    • Шаблоны функций
    • Шаблон класса
    • Специализация шаблона класса
    • Наследование и шаблоны классов
    • Типы контейнеров
    • Вектор
    • Итераторы
    • Операции с векторами
    • Array
    • List
    • Forward_list
    • Deque
    • Стек std::stack
    • Очередь std::queue
    • Очередь приоритетов std::priority_queue
    • Множества
    • Словарь std::map
    • Span
    • Определение строк
    • Строки с поддержкой Unicode
    • Преобразование типов и строки
    • Сравнение строк
    • Получение подстроки и проверка начала и конца строки
    • Поиск подстроки
    • Изменение строки
    • Операции с символами
    • Программа подсчета слов
    • Тип std:string_view
    • rvalue
    • Конструктор перемещения
    • Оператор присваивания с перемещением
    • Роль noexcept при перемещении
    • Объекты функций
    • Лямбда-выражения
    • Захват внешних значений в лямбда-выражениях
    • Шаблон std::function<>
    • Минимальный и максимальный элементы
    • Поиск элементов
    • Копирование элементов
    • Удаление элементов и идиома Remove-Erase Idiom
    • Сортировка
    • Представления. Фильтрация
    • Проекция данных
    • Пропуск элементов. drop_view и drop_while_view
    • Извлечение диапазона элементов. take_view и take_while_view
    • Цепочки представлений
    • Оператор requires
    • Концепты
    • Выражение requires
    • Ограничения типа для auto
    • Базовые типы для работы с потоками
    • Файловые потоки. Открытие и закрытие
    • Чтение и запись текстовых файлов
    • Переопределение операторов ввода и вывода
    • Математические константы и операции
    • Форматирование строк и функция format
    • std::optional
    • Управление ресурсами. Идиома RAII
    • Идиома копирования и замены
    • Идиома Move-and-Swap
    • Первая программа в Visual Studio
    • Первая программа в Qt Creator

    Помощь сайту
    410011174743222
    Перевод на карту
    Номер карты:
    4048415020898850

    Контакты для связи: metanit22@mail.ru

    Copyright © metanit.com, 2024. Все права защищены.

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

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