Переписать содержимое одного файла в другой - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Прога должна читать 1 текстовый файл, и перезаписывать его в другой, с клавы задаётся длинна строки записываемой во 2ой файл. Вообщем написал по-быстренькому прогу, считает кол-во символов, потом создаем через mallac массив р, записываем в него посимвольно текст, проверяем что записали в консольки, и записываем массив в 2ой файл, вот тут у меня и получается косяк, периодически какие-то символы левые, и нету перехода '\n' ... (41 строка по идее) пы.сы. Если кто предложит вообще другое решение, буду рад, т.к. понял что в Си я значительно слабее
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. int main()
  5. {
  6. int x,j=0;
  7. char str;
  8. FILE *file;
  9. FILE *file2;
  10. char* file_name1 = "file.txt";
  11. char* file_name2 = "file2.txt";
  12. file = fopen( file_name1, "r");
  13. while (!feof(file))
  14. {
  15. str=getc(file);
  16. j++;
  17. }
  18. fclose(file);
  19. char *p = malloc(j*sizeof(char));
  20.  
  21. int i,line=0;
  22. file = fopen( file_name1, "r");
  23. file2 = fopen( file_name2, "wb");
  24. printf("Please enter line string:");
  25. scanf("%d",&x);
  26. char c = '\n';
  27. for (i=0;i<=j;i++)
  28. {
  29. line++;
  30. p[i]=getc(file);
  31. if (line==x)
  32. {
  33. printf("%c\n",p[i]);
  34. fprintf(file2,"%c%c",p[i],c);
  35. line=0;
  36. }
  37. else
  38. {
  39. fprintf(file2,"%c",p[i]);
  40. printf("%c",p[i]);
  41. }
  42. }
  43. fclose(file2);
  44. fclose(file);
  45. //printf("\n\n%s", str);
  46. fclose( file );
  47.  
  48. return 0;
  49. }

Решение задачи: «Переписать содержимое одного файла в другой»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5. #define SIZE 2048 //
  6. int main()
  7. {
  8.     char buf[SIZE];
  9.     int sz=0;
  10.     FILE *file1;
  11.     FILE *file2;
  12.     const char* file_name1 = "file1";
  13.     const char* file_name2 = "file2";
  14.     file1 = fopen( file_name1, "r");
  15.     file2 = fopen( file_name2, "wb");
  16.     // проверка на ошибки?
  17.     if (!file1 || !file2) {
  18.         puts ("Error. File not found\n");
  19.         exit(1);
  20.     }
  21.     puts("Please enter size of string:");
  22.     scanf("%d",&sz);
  23.     while(!feof(file1)) {
  24.         fgets(buf, SIZE, file1);
  25.         int size=strlen(buf);
  26.         // пропустить пустіе строки
  27.         if (buf[0]=='\n') {
  28.             continue;
  29.         } else
  30.             /* размер меньше буфера, обрезаем строку до sz*/
  31.             if (sz<size) {
  32.                 buf[sz]='\0';
  33.                 fputs(buf, file2);
  34.                 fputs("\n", file2);
  35.             } else
  36.                 /* а тут ничего не нужно, т.к. символ "\n" уже прочитан*/
  37.                 fputs(buf, file2);
  38.     }
  39.     fclose(file2);
  40.     fclose(file1);
  41.     return 0;
  42. }

Объяснение кода листинга программы

  1. Объявление переменных:
    • buf - массив символов для чтения данных из первого файла
    • sz - переменная для хранения размера строки
    • file1, file2 - указатели на файлы
    • file_name1, file_name2 - строки с именами файлов
    • size - переменная для хранения размера строки
  2. Открытие файлов:
    • file1 = fopen(file_name1, r) - открытие первого файла для чтения
    • file2 = fopen(file_name2, wb) - открытие второго файла для записи
  3. Проверка на ошибки:
    • проверка на NULL значений file1 и file2
    • если файлы не открылись, выводится сообщение об ошибке и программа завершается
  4. Запрос размера строки:
    • вывод сообщения Please enter size of string:
    • считывание размера строки с помощью scanf( %d, &sz )
  5. Чтение и запись данных:
    • 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' в второй файл после каждой строки
  6. Закрытие файлов:
    • fclose(file2)
    • fclose(file1)
  7. Завершение программы:
    • return 0 - завершение работы программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.333 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы