Write() записывает лишние символы в конец файла - C (СИ)

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

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

Добрый день! Писал для себя прогу, чтобы зашифровать кое-какие файлы, наткнулся на странную вещь. Разобрался во всем, кроме вот чего: write(dfile,mem,size) записывает из файла c:\1.txt :
123 233
в файл c:\2.txt вот что:
123 2333
Было 8 байт, стало 9. Почему - не пойму. Может вы знаете в чем дело?
#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;
}
Добавлено через 10 минут 21 секунду

Что-то сообщение не хочет редактироваться...

Среда 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);
}

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

  1. Подключение необходимых заголовочных файлов для работы с файлами и выводом на экран.
  2. Объявление переменных:   — sname[255] и dname[255] - массивы символов для хранения имён файлов;   — i - счётчик, используемый в цикле;   — sfile и dfile - дескрипторы файлов;   — size - переменная для хранения размера файла;   — info - переменная для хранения информации о файле;   — mem[1024] - буфер для чтения и записи данных;   — inf - структура для хранения информации о файле.
  3. Ввод исходного файла и имени целевого файла с помощью функции cin.
  4. Открытие исходного файла с помощью функции open, присвоение его дескриптора переменной sfile.
  5. Открытие целевого файла с помощью функции open, присвоение его дескриптора переменной dfile.
  6. Получение информации о файле с помощью функции fstat и сохранение её в структуре inf.
  7. Чтение данных из исходного файла с помощью функции read в буфер mem, размером равным размеру файла.
  8. Запись данных из буфера mem в целевой файл с помощью функции write.
  9. Вывод количества прочитанных и записанных байт.
  10. Вывод содержимого буфера mem.
  11. Закрытие исходного и целевого файлов с помощью функции close.
  12. Ожидание ввода пользователя с помощью функции getch для корректного закрытия программы.

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


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

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

12   голосов , оценка 4.417 из 5
Похожие ответы