Переписать содержимое одного файла в другой - 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 - завершение работы программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д