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