Переписать содержимое одного файла в другой - C (СИ)
Формулировка задачи:
Прога должна читать 1 текстовый файл, и перезаписывать его в другой, с клавы задаётся длинна строки записываемой во 2ой файл. Вообщем написал по-быстренькому прогу, считает кол-во символов, потом создаем через mallac массив р, записываем в него посимвольно текст, проверяем что записали в консольки, и записываем массив в 2ой файл, вот тут у меня и получается косяк, периодически какие-то символы левые, и нету перехода '\n' ... (41 строка по идее)
пы.сы. Если кто предложит вообще другое решение, буду рад, т.к. понял что в Си я значительно слабее
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int x,j=0; char str; FILE *file; FILE *file2; char* file_name1 = "file.txt"; char* file_name2 = "file2.txt"; file = fopen( file_name1, "r"); while (!feof(file)) { str=getc(file); j++; } fclose(file); char *p = malloc(j*sizeof(char)); int i,line=0; file = fopen( file_name1, "r"); file2 = fopen( file_name2, "wb"); printf("Please enter line string:"); scanf("%d",&x); char c = '\n'; for (i=0;i<=j;i++) { line++; p[i]=getc(file); if (line==x) { printf("%c\n",p[i]); fprintf(file2,"%c%c",p[i],c); line=0; } else { fprintf(file2,"%c",p[i]); printf("%c",p[i]); } } fclose(file2); fclose(file); //printf("\n\n%s", str); fclose( file ); return 0; }
Решение задачи: «Переписать содержимое одного файла в другой»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> #define SIZE 2048 // int main() { char buf[SIZE]; int sz=0; FILE *file1; FILE *file2; const char* file_name1 = "file1"; const char* file_name2 = "file2"; file1 = fopen( file_name1, "r"); file2 = fopen( file_name2, "wb"); // проверка на ошибки? if (!file1 || !file2) { puts ("Error. File not found\n"); exit(1); } puts("Please enter size of string:"); scanf("%d",&sz); while(!feof(file1)) { fgets(buf, SIZE, file1); int size=strlen(buf); // пропустить пустіе строки if (buf[0]=='\n') { continue; } else /* размер меньше буфера, обрезаем строку до sz*/ if (sz<size) { buf[sz]='\0'; fputs(buf, file2); fputs("\n", file2); } else /* а тут ничего не нужно, т.к. символ "\n" уже прочитан*/ fputs(buf, file2); } fclose(file2); fclose(file1); return 0; }
Объяснение кода листинга программы
- Объявление переменных:
- buf - массив символов для чтения данных из первого файла
- sz - переменная для хранения размера строки
- file1, file2 - указатели на файлы
- file_name1, file_name2 - строки с именами файлов
- size - переменная для хранения размера строки
- Открытие файлов:
- file1 = fopen(file_name1,
r
) - открытие первого файла для чтения - file2 = fopen(file_name2,
wb
) - открытие второго файла для записи
- file1 = fopen(file_name1,
- Проверка на ошибки:
- проверка на NULL значений file1 и file2
- если файлы не открылись, выводится сообщение об ошибке и программа завершается
- Запрос размера строки:
- вывод сообщения
Please enter size of string:
- считывание размера строки с помощью scanf(
%d
, &sz )
- вывод сообщения
- Чтение и запись данных:
- while(!feof(file1)) - цикл чтения данных из первого файла до конца
- fgets(buf, SIZE, file1) - считывание строки из первого файла в buf
- size = strlen(buf) - определение размера строки
- если buf[0] == '\n', то продолжение цикла без записи данных
- если sz < size, то запись в buf первых sz символов и символа '\0' в buf[sz]
- fputs(buf, file2) - запись данных из buf в второй файл
- fputs(
\n
, file2) - запись символа '\n' в второй файл после каждой строки
- Закрытие файлов:
- fclose(file2)
- fclose(file1)
- Завершение программы:
- return 0 - завершение работы программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д