Чтение в файле в блоках по 1 КБ и запись в другой файл с помощью cstdio - PullRequest
0 голосов
/ 19 января 2012

Я пытаюсь написать простую программу, которая читает данные из файла (входные данные) блоками по 1024 байта, а затем записывает данные в другой файл (выходные данные).Программа работает до сих пор, но проблема, с которой я столкнулся, состоит в том, что если она достигает конца файла и последнее чтение не является аккуратным блоком из 1024 байтов, то она выводит данные мусора для остальной части массива.У меня это работает нормально, используя функции fstream, но когда я использую функции cstdio (назначение состоит в том, чтобы использовать fread и fwrite), когда я получаю проблему.Вот мой код:

#include <cstdio>
using namespace std;


int main()
{
    FILE* fin;
    FILE* fout;
    char block[1024];


    fin = fopen("input", "r");
    fout = fopen("output", "w+");

    while (!feof(fin))
    {
        fread(block,1024,1,fin);
        fwrite(block,1,1024,fout);
    }

    fclose(fin);
    fclose(fout);

    return 0;
}

Я уверен, что это простое исправление, но я не могу найти какую-либо информацию об этом на cplusplus.com, и я не могу понять, как это слововопрос в гугле.Я ценю ваши мысли по этому поводу.

Ответы [ 2 ]

4 голосов
/ 19 января 2012

У вас есть size и count аргументы вокруг неправильного пути в fread.Если вы попытаетесь fread один элемент размером 1 КБ, и в файле останется только пятнадцать байтов, вы получите ничего , и файл навсегда останется непрочитанным.То есть, пока ваши fwrite вызовы не заполнят диск, , затем вы будете знать об этом.

Другими словами, вы никогда не увидите эти последние пятнадцать байтов.Это потому, что хотя fread с радостью даст вам меньше элементов , чем вы просите, оно даст вам только целые элементы, а не частичные.

Что вам нужно сделать, так это попробоватьи прочитайте 1024 элемента размером один байт каждый (а не один элемент размером 1024 байта).

fread также возвращает фактическое количество прочитанных элементов (что, как отмечено выше, можетбыть меньше, чем вы просили) и это что вы должны передать fwrite (a) :

size_t bytCount;
while (! feof (fin)) {
    bytCount = fread (block, 1, sizeof(block), fin);
    fwrite (block, 1, bytCount, fout);
}

Вы увидите, что ятакже изменил магическое число 1024 на sizeof(block) - это сведет к минимуму изменения исходного кода, необходимые при увеличении размера буфера.


(a) Если вы хотеличтобы быть действительно надежным, fwrite также возвращает количество написанных элементов, которое может быть меньше, чем вы запрашивали.Идеальный код также проверил бы это условие.

0 голосов
/ 19 января 2012

1024 - ваш размер буфера. fread возвращает фактическое количество байтов, прочитанных из файла (помещенных в буфер). Используйте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...