Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

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

#cpp #c #файлы


Вот у меня есть функция, которая создает файл размеров в 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()? Или есть еще какие-нибудь
решения этой проблемы?
    


Ответы

Ответ 1



[Тоскливо] Наверное, в сотый раз пишу здесь, что использовать while (!feof(f1)) категорически нельзя, так как флаг конца файла устанавливается после неудачного чтения за концом файла. Этот 11-й раз - последний и неудачный - раз вы читаете, но ничего не считываете, и записываете в результате лишний блок...

Ответ 2



while ( 1 ) { fread(buff, 1024, 1, f1); if (feof(f1)) break; if (ferror(f1)) { /* Обработка ошибки*/ break;} fwrite(buff, 1024, 1, f2); }

Комментариев нет:

Отправить комментарий