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

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

  • автор:

Запись в конец файла c++

Здравствуйте, я сделал запись в файл с одного класса, но нужно дописать в этот же файл результаты из второго класса, результаты накладываются и в итоге в файле только результаты работы второго класса. Как сделать запись в конец файла? Мы используем ios_base::app. Спасибо Brave_Lime за ответ.

 std::ofstream vmdelet_out; //создаем поток vmdelet_out.open("file.txt", std::ios::app); // открываем файл для записи в конец vmdelet_out  

Отслеживать

задан 8 мая 2017 в 16:49

355 1 1 золотой знак 7 7 серебряных знаков 23 23 бронзовых знака

покажите код всего этого

8 мая 2017 в 16:53

1 ответ 1

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

Запись

std::ofstream vmdelet_out; //создаем поток vmdelet_out.open("file.txt", std::ios::app); // открываем файл для записи в конец vmdelet_out  

Построчное чтение

#include #include #include int main(void) < std::fstream f; // создаем поток f.open("file.txt", std::ios::in); // открываем файл для чтения if (f) // если файл открылся < std::string buf; // создаем буфер, куда будет считываться информация while (getline(f, buf)) // Пока мы получили строку - тело цикла исполняется || когда файл закончился (все строки считались) - цикл false < std::cout > > 

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

При работе с текстовыми файлами граздо проще работать с данными не как с отдельными символами, а как со строками с помощью функций fgets() и fputs() .

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

Функция fputs() записывает в файл строку, то есть набор символов, который завершается символом '\0'. Она имеет следующий прототип:

int fputs(const char *s, FILE *stream);

Первый параметр функции - записываемая строка, а второй - указатель на файловый поток. В качестве результата функция возвращает неотрицательное целое число. При ошибках в процессе записи возвращается значение EOF .

При записи строки нулевой символ '\0' в файл не записывается.

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

#include int main(void) < // строка для записи char * message = "Hello METANIT.COM!\nAn apple a day keeps the doctor away"; // файл для записи char * filename = "data.txt"; // запись в файл FILE *fp = fopen(filename, "w"); if(fp) < // записываем строку fputs(message, fp); fclose(fp); printf("File has been written\n"); >>

Запись довольно проста: открываем файл на запись и с помощью вызова fputs(message, fp) записываем в файл искомую строку.

Чтение текстового файла

Функция fgets() считывает из файла одну строку и имеет следующий прототип:

char * fgets(char *s, int n, FILE *sream);

Первый параметр char *s представляет строку, в которую производится считывание. Второй параметр - число n указывает, сколько символов необходимо считывать. И третий параметр представляет файловый поток, из которого производится считывание.

При вызове функция считывает из файла не более n-1 символов. Функция прекращает чтение, когда прочтет n-1 символов или встретит символ переноса строки \n. Все считанные символы записываются в строку s, в том числе символ \n. И также конец каждой строки дописывается нулевой символ '\0'.

При успешном завершении функция возвращает указатель s , а при ошибке или достижении конца файла возвращается значение NULL .

Считаем данные из выше записанного файла "data.txt":

#include int main(void) < // файл чтения char * filename = "data.txt"; // буфер для считавания данных из файла char buffer[256]; // чтение из файла FILE *fp = fopen(filename, "r"); if(fp) < // пока не дойдем до конца, считываем по 256 байт while((fgets(buffer, 256, fp))!=NULL) < printf("%s", buffer); >fclose(fp); > >

Здеcь открываем файл на чтение и в цикле считываем из файла по 256 символов и выводим их на консоль с помощью вызова fgets(cc, 256, fp) . Когда данные в файле закончатся, функция возвратит NULL, и произойдет выход из цикла.

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

Другой пример работы с текстовыми файлами - копирование содержимого из одного файла в другой:

#include int main(void) < char * filename1 = "data1.txt"; char * filename2 = "data2.txt"; char buffer[256]; FILE *f1 = fopen(filename1, "r"); // файл на чтение FILE *f2 = fopen(filename2, "w"); // файл на запись if(!f1 || !f2) < printf("Error occured while opening file\n"); >else < // пока не дойдем до конца, считываем по 256 байт из файла f1 while((fgets(buffer, 256, f1))!=NULL) < // записываем строку в файл f2 fputs(buffer, f2); printf("%s", buffer); >> fclose(f1); fclose(f2); return 0; >

Поставить курсор в конец файла и записать строку

Author24 — интернет-сервис помощи студентам

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

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Как записать строку не в конец файла
Мне необходимо записать строку не в конец файла, а допустим в какую-то произвольную строку. Как это.

Записать юникод строку в конец файла
Внезапно возник ступор с тривиальной задачей. Необходимо записать юникод-строку в конец текстового.

Работа с файлами: записать в конец файла строку символов
Помогите дописать код! Изначально задача звучит так: Составить программу, осуществляющую открытие.

При клике на input поставить курсор в конец строки
Как при помощи jquery поставить курсор в конец строки?

838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409

Лучший ответ

Сообщение было отмечено Памирыч как решение

Решение

1 2 3 4
FILE* fp = fopen("file.txt", "a"); fputs("* * * CYBERFORUM * * *", fp); //. fclose(fp);

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Как можно записать строку в конец файла, чтобы данные которые были в нем не стерлись?
Подскажит, как на С++ можно записать строку в конец файла, чтобы данные которые были в нем не.

После клика текст вставляется но курсор стоит в начале текста, кто знает как поставить в конец
<script type="text/javascript"> <!-- function replaceSelectedText(obj,cbFunc) < obj.focus(); .

Как в компоненте DataGridView поставить курсор на нужную строку?
Подскажите мне, как в компоненте DataGridView поставить курсор на нужную строку 🙂

Поставить курсор файла в начало
Я читаю весь файл и перемещаю курсор в его начало. После пытаюсь прочитать его снова, но вместо.

Или воспользуйтесь поиском по форуму:

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

Операция чтения-записи всегда производится с текущей позиции в потоке. При открытии потока в режимах r и w указатель текущей позиции устанавливается на начальный байт потока. При открытии в режиме a указатель устанавливается на конец файла сразу за конечным байтом. И при выполнении операции чтения-записи указатель в потоке перемещается на новую позиции в соответствии с числом прочитанных или записанных байтов.

Однако вполне возможно, что нам потребуется считывать или записывать с какой-то определенной позиции в файле. Например, в айдиофайле в формате wav собственно звуковые данные расположены, начиная с 44 байта. И если, к примеру, мы хотим распознать звук из файла, что-то с ним сделать, то нам при считывании данных надо переместить указатель на соответствующую позицию.

В языке Си для управления позицией указателя в потоке применяется функция fseek() , которая имеет следующий синтаксис:

int fseek(указатель_на_поток, смещение, начало_отсчета);

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

Третий параметр - начало_отсчета задает начальную позицию, относительно которой идет смещение. В качестве этого параметра мы можем использовать одну из встроенных констант, определенных в файле stdio.h :

  • SEEK_SET : имеет значение 0 и представляет начало файла
  • SEEK_CUR : имеет значение 1 и представляет текущую позицию в потоке
  • SEEK_END : имеет значение 2 и представляет конец файла

Если перемещение указателя было успешно выполнено, то функция fseek() возвращает 0, иначе она возвращает ненулевое значение.

Применим функцию fseek в программе:

#include void load(char *, int); void save(char *); int main(void) < // файл для записи и чтения char * filename = "data.txt"; // позиция, с которой начинается считывание int position = 6; save(filename); load(filename, position); return 0; >void load(char * filename, int position) < // буфер для считавания данных из файла char buffer[256]; // чтение из файла FILE *fp = fopen(filename, "r"); if(!fp) < printf("Error occured while opening file\n"); return; >// перемещаем указатель в файле на позицию position fseek(fp, position, SEEK_SET); // пока не дойдем до конца, считываем по 256 байт while((fgets(buffer, 256, fp))) < printf("%s", buffer); >fclose(fp); > void save(char * filename) < // строка для записи char * message = "Hello METANIT.COM!"; // запись в файл FILE *fp = fopen(filename, "w"); if(!fp) < printf("Error occured while opening file\n"); return; >// записываем строку fputs(message, fp); fclose(fp); printf("File has been written\n"); >

Здесь функция save() записывает в файл строку "Hello METANIT.COM!". Далее функция load() считывет данные из этой строки. Но считывает не сначала, а с позиции, которая передается через параметр position :

// перемещаем указатель в файле на позицию position fseek(fp, position, SEEK_SET);

Поскольку третий аргумент равен SEEK_SET , то указатель файла смещается к байту с индексом position. Соответственно далее функция fgets() будет считывать данные не с самого начала файла, а с позиции position:

while((fgets(buffer, 256, fp)))

Поскольку в данном случае в качестве позиции передается число 6, то в тексте файла будут пропущены первые 6 символов, и будет считана подстрока "METANIT.COM!"

ftell

Кроме функции fseek() мы можем использовать для управления позицией указателя еще пару функций:

  • long ftell(FILE *) : получает текущую позицию указателя
  • void rewind(FILE *) : указатель устанавливается на начало потока

Например, мы можем применять функцию ftell для вычисления длины файла в байтах:

#include int main(void) < FILE* fp = fopen("test.txt", "r"); if(!fp) // если не удалось открыть файл < printf("Error while opening file\n"); return -1; >// если удалось, открыть файл получаем его длину fseek(fp, 0, SEEK_END); // устанавливаем указатель на конец файл long size = ftell(fp); // получаем значение указателя относительно начала fclose(fp); // закрываем файл printf("File size: %ld bytes\n", size); >

В данном случае находим длину файла "text.txt", который располагается в папке программы. Само находждение длины разбивается на два этапа. Сначала помещаем указатель в файле на конец с помощью функции fseek() :

fseek(fp, 0, SEEK_END);

Затем с помощью функции ftell() вычисляем положение указателя относительно начала файла - фактически получаем размер файла в байтах

long size = ftell(fp);

Считывание определенной структуры из файла

Рассмотрим более сложный пример:

#include #include struct person < char name[20]; int age; >; int save(char * filename, struct person *st, int n); int load(char * filename); int main(void) < char * filename = "people.dat"; struct person people[] = < , , , >; int n = sizeof(people) / sizeof(people[0]); save(filename, people, n); load(filename); return 0; > // запись в файл массива структур int save(char * filename, struct person * st, int n) < char *c; // указатель для посимвольной записи данных // число записываемых байтов int size = n * sizeof(struct person); FILE * fp = fopen(filename, "wb"); if (!fp) < printf("Error occured while opening file\n"); return 1; >// записываем количество структур c = (char *)&n; for (int i = 0; i < sizeof(n); i++) < putc(*c++, fp); >// посимвольно записываем в файл все структуры c = (char *)st; for (int i = 0; i < size; i++) < putc(*c, fp); c++; >fclose(fp); return 0; > // загрузка из файла массива структур int load(char * filename) < char *c; // указатель на считывания очередного символа int n = sizeof(struct person); // сколько байт надо считать для структуры int index; // номер структуры из файла: printf("Enter user number: "); // ввод номера структуры scanf("%d", &index); FILE * fp = fopen(filename, "rb"); // открываем файл на чтение if (!fp) < printf("Error occured while opening file\n"); return 1; >// выделяем память для количества структур int *ptr_count = malloc(sizeof(int)); // считываем количество структур c = (char *)ptr_count; int m = sizeof(int); // сколько надо считать структур // пока не считаем m байт while (m > 0 && (*c = getc(fp))!=EOF) // сохраняем байт в выделенный блок для размера массива < c++; m--; >//получаем число элементов int count = *ptr_count; free(ptr_count); // освобождаем память // если номер запрощенной структуры меньше кол-ва структур if(index > count) < printf("User number out of range\n"); fclose(fp); return 1; >// получаем, на сколько байтов надо перемотать указатель относительно начала позиции int pos = (index-1) * n + 4; // перемещаем указатель на нужную позицию fseek(fp, pos, SEEK_SET); // выделяем память для считываемой структуры struct person * ptr = malloc(sizeof(struct person)); // устанавливаем указатель на начало блока памяти c = (char *)ptr; // после записи считываем посимвольно из файла while(n > 0 && (*c=getc(fp))!=EOF) < c++; n--; >// вывод считанных данных на консоль printf("%-10s %5d \n", ptr->name, ptr->age); free(ptr); fclose(fp); return 0; >

С помощью функции save в файл сохраняется массив структур. Затем в функции load считываем одну из структур по введенному номеру.

Для поиска нужной структуры вычисляем позицию:

int pos = (index-1) * n + 4;

Исходя из записи мы знаем, что первые 4 байта в файле отводятся под хранение количества структур, соответственно при чтении нам надо пропустить эти 4 байта.

Например, мы хотим получить первую структуру. По формуле получаем (index-1) * n + 4 = 4. То есть первая структура будет располагаться после 4-го байта. Аналогично вторая структура будет располагаться после n+4 байт, где n - это размер структуры.

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

// перемещаем указатель на нужную позицию fseek(fp, pos, SEEK_SET);

При последующей операции чтения с помощью функции getc() :

while(n > 0 && (*c=getc(fp))!=EOF)

эта функция будет считывать данные с позиции pos , по которой располагается структура с номером index.

Результат работы программы:

Input user number: 2 Alice 27

Стоит отметить, что для большей краткости здесь убрана проверка на наличие структуры по введенному номеру, так как пользователь может ввести число, которое превышает количество

Обновление структуры в файле

Мы можем использовать указатель в потоке не только для чтения, но и для записи данных. Например:

#include struct person < unsigned id; char name[10]; int age; >; void save(char*); void update_age(char*, int, int); int main() < char * filename = "people.bin"; save(filename); update_age(filename, 2, 33); // в структуре с устанавливаем age = 33 >void save(char* filename) < struct person people[] = < , , >; int size = sizeof(people[0]); // размер всего массива int count = sizeof(people) / size; // количество структур // запись файла FILE *fp = fopen(filename, "w"); // записываем массив структур fwrite(people, size, count, fp); fclose(fp); printf("%d people saved\n", count); > void update_age(char* filename, int id, int age) < // считывание файла, пока не найдем структуру с определенным id struct person p; // структура для чтения int size = sizeof(p); FILE* fp = fopen(filename, "r+"); // "r+" - открываем файл для изменения // считываем данные в структуру while(fread(&p, sizeof(p), 1, fp)==1) < // если нашли структуру с нужным id if(p.id == id) < p.age = age; // изменяем возраст fseek(fp, -1*size, SEEK_CUR); // перемещаем в потоке на один объект назад fwrite(&p, size, 1, fp); // записываем обновленную структуру break; // выходим из цикла >> rewind(fp); // перематываем файл назад // считываем по одной структуре и проверяем изменения while(fread(&p, sizeof(p), 1, fp) == 1) < printf("Id: %d \t Name: %s \t Age: %d \n", p.id, p.name, p.age); >fclose(fp); >

В функции update_age() обновляем возраст пользователя по определенному id. Для этого открываем файл с флагом "r+", то есть для чтения с измением.

FILE* fp = fopen(filename, "r+");

Затем считываем по одной структуре и проверяем id. Если id структуры равен запрошенному id, то изменяем возраст и перезаписываем структуру в файле:

if(p.id == id) < p.age = age; // изменяем возраст fseek(fp, -1*size, SEEK_CUR); // перемещаем в потоке на один объект назад fwrite(&p, size, 1, fp); // записываем обновленную структуру break; // выходим из цикла >

Для перезаписи перемещаемся в файле на начало структуры ( fseek(fp, -1*size, SEEK_CUR) ). Поскольку, когда мы считали структуру, указатель в файле указывает на следующую за ней структуру.

Поскольку id у структур уникальны, соответственно нам надо изменить только один объект, поэтому после изменения объекта выходим из цикла.

Чтобы до закрытия файла вывести в этой же функции все структуры из файла, перемещаем указатель в файле на начало с помощью функции rewind()

rewind(fp); // перематываем файл назад

Таким образом, структура с где изначально age был равен 27, изменит это значение age на 33. Консольный вывод программы:

3 people saved Id: 1 Name: Tom Age: 38 Id: 2 Name: Sam Age: 33 Id: 3 Name: Bob Age: 42

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

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