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