Переписать содержимое одного файла в другой - 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;
}

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

  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
Похожие ответы