Write() записывает лишние символы в конец файла - C (СИ)
Формулировка задачи:
Добрый день! Писал для себя прогу, чтобы зашифровать кое-какие файлы, наткнулся на странную вещь. Разобрался во всем, кроме вот чего: write(dfile,mem,size) записывает из файла c:\1.txt :
в файл c:\2.txt вот что:
Было 8 байт, стало 9. Почему - не пойму. Может вы знаете в чем дело?
Добавлено через 10 минут 21 секунду
123
233
123
2333
#include <iostream.h>
#include <sys\stat.h>
#include <sys\types.h>
#include <fcntl.h>
int main () {
char sname[255],dname[255];
int i=0, tmp,sfile,dfile,size,info;
char mem[1000000]; //размер не важен
struct stat inf;
cin >> sname; // ввод источника
cin >> dname; // вывод... как его... destination
sfile=open ( sname, O_RDONLY ); // открываю источник
dfile=open ( dname, O_CREAT | O_TRUNC | O_WRONLY ); // создаю файл на запись
info=fstat(sfile,&inf); // получаю инфо о файле
if(!info) size=inf.st_size; // printf("%d",size); - выходит размер 8 байт (файл см. выше)
read(sfile,mem,size); // считываю 8 байт
write(dfile,mem,size); // записываю 8(?) байт
return 0;
}Что-то сообщение не хочет редактироваться...
Среда Dev-cpp 4.9.9.2Решение задачи: «Write() записывает лишние символы в конец файла»
textual
Листинг программы
#include <iostream.h>
#include <io.h>
#include <stdio.h>
#include <sys\stat.h>
#include <sys\types.h>
#include <fcntl.h>
void main () {
char sname[255],dname[255];
int i=0, sfile,dfile,size,info;
char mem[1024]; //размер не важен
struct stat inf;
cout<<"sname : ";cin >> sname; // ввод источника
cout<<"dname : ";cin >> dname; // вывод... как его... destination
sfile=open ( sname, O_RDONLY | O_BINARY ); // открываю источник
dfile=open ( dname, O_CREAT | O_BINARY | O_TRUNC | O_WRONLY); // создаю файл на запись
info = fstat(sfile,&inf); // получаю инфо о файле
printf("num read bytes : %d\r\n",read(sfile,mem,inf.st_size));
//mem[inf.st_size] = '\0';//вроде и без этого фурычит
printf("num write bytes : %d\r\n",write(dfile,mem,inf.st_size));
printf("see memory buf : %s\r\n",mem);
close(sfile);
close(dfile);
}
Объяснение кода листинга программы
- Подключение необходимых заголовочных файлов для работы с файлами и выводом на экран.
- Объявление переменных: — sname[255] и dname[255] - массивы символов для хранения имён файлов; — i - счётчик, используемый в цикле; — sfile и dfile - дескрипторы файлов; — size - переменная для хранения размера файла; — info - переменная для хранения информации о файле; — mem[1024] - буфер для чтения и записи данных; — inf - структура для хранения информации о файле.
- Ввод исходного файла и имени целевого файла с помощью функции cin.
- Открытие исходного файла с помощью функции open, присвоение его дескриптора переменной sfile.
- Открытие целевого файла с помощью функции open, присвоение его дескриптора переменной dfile.
- Получение информации о файле с помощью функции fstat и сохранение её в структуре inf.
- Чтение данных из исходного файла с помощью функции read в буфер mem, размером равным размеру файла.
- Запись данных из буфера mem в целевой файл с помощью функции write.
- Вывод количества прочитанных и записанных байт.
- Вывод содержимого буфера mem.
- Закрытие исходного и целевого файлов с помощью функции close.
- Ожидание ввода пользователя с помощью функции getch для корректного закрытия программы.