Лишний вывод в файл

295
18 октября 2017, 06:57

Вот у меня есть функция, которая создает файл размеров в 10 КБ

void CreateFile(string name)
{
    const unsigned int length = 10;
    char buff[1024];    
    fstream f;
    f.open(name, ios::binary | ios::out);
    for (unsigned int i = 0; i < length; i++)
        f.write((char*)&buff, sizeof(buff));
    f.close();
}

И вот у меня есть функция, копирующая этот файл, а также возвращающая время копирования:

int First(string nameIn, string nameOut)
{
    unsigned int timeStart, timeStop;
    FILE *f1;
    FILE *f2;
    char buff[1024];
    f1 = fopen(nameIn.c_str(), "r");
    f2 = fopen(nameOut.c_str(), "w");
    if (!f1 || !f2) return -1;  //если не удалось открыть
    rewind(f1);
    timeStart = clock();
    while (!feof(f1))  //проблема
    {
        fread(buff, 1024, 1, f1);
        fwrite(buff, 1024, 1, f2);
    }
    timeStop = clock();
    fclose(f1);
    fclose(f2);
    return timeStop - timeStart;
}

Но вот проблема: размер нового файла не 10 КБ, как ожидалось, а 11! 1 лишний раз записывает буфер. Проблема в условии цикла. Как заменить feof()? Или есть еще какие-нибудь решения этой проблемы?

Answer 1

[Тоскливо] Наверное, в сотый раз пишу здесь, что использовать

while (!feof(f1)) 

категорически нельзя, так как флаг конца файла устанавливается после неудачного чтения за концом файла. Этот 11-й раз - последний и неудачный - раз вы читаете, но ничего не считываете, и записываете в результате лишний блок...

Answer 2
while ( 1 )
    {
        fread(buff, 1024, 1, f1);
        if (feof(f1)) break;
        if (ferror(f1)) { /* Обработка ошибки*/ break;} 
        fwrite(buff, 1024, 1, f2);
    }
READ ALSO
Знакомство с тестами

Знакомство с тестами

Никогда не писал модульных тестов, появилось задание с ними познакомиться и научиться использоватьЕсть некая функция "сортировки" массива...

260
Как поместить в QTableWidget изображение?

Как поместить в QTableWidget изображение?

Необходимо поместить в QTableWidget изображение, с возможностью его перемещать внутри таблицы по ячейкам, как это делается нормально?

282
Скачивание картинки

Скачивание картинки

Есть картинки, после клика на картинку выполняется код:

265