2015-09-02 2 views
2

Я пытаюсь прочитать файл, и я понял, что он потерпит неудачу, потому что я пытаюсь прочитать слишком много данных, хотя файл намного больше, чем что я пытаюсь прочитать.Чтение Ifstream с определенным размером (не связанным с размером файла)

Файл 120 Мб, а мой ifstream терпит неудачу на 12967 байт (даже если он начинает действовать странно на 12801.

Вот код, иллюстрирующий мою проблему:

#include <fstream> 
#include <iostream> 
#include <Windows.h> 

using std::ifstream; 
using std::cout; 

#define CORRECT_SIZE 12800 
#define CORRECT_BUT_WIERD 12966 
#define INCORRECT_SIZE 12967 

bool check_error_bits(ifstream* f); 

int main() 
{ 
    ifstream myFile("myfile.txt"); 
    char c[CORRECT_SIZE]; 
    char c2[CORRECT_BUT_WIERD]; 
    char c3[INCORRECT_SIZE]; 

    /* 
    * TEST A (works fine) 
    */ 
    myFile.seekg(0, std::ios_base::beg); 
    myFile.read(c, CORRECT_SIZE); 
    check_error_bits(&myFile); 
    cout << myFile.tellg() << std::endl; // Here, tellg() returns 12800 

    /* 
    * TEST B (works too, but acts wierd) 
    */ 
    myFile.seekg(0, std::ios_base::beg); 
    myFile.read(c2, CORRECT_BUT_WIERD); 
    check_error_bits(&myFile); 
    cout << myFile.tellg() << std::endl; // Here, tellg() returns 16896 

    /* 
    * TEST C (FAIL) 
    */ 
    myFile.seekg(0, std::ios_base::beg); 
    myFile.read(c3, INCORRECT_SIZE); 
    check_error_bits(&myFile); 
    cout << myFile.tellg() << std::endl; // Here, tellg() returns -1 

    system("pause"); 
} 

bool check_error_bits(ifstream* f) 
{ 
    bool stop = false; 

    if (f->eof()) 
    { 
     char msg[500]; 
     strerror_s(msg, errno); 
     cout << "1: " << msg << std::endl; 
    } 

    if (f->fail()) 
    { 
     char msg[500]; 
     strerror_s(msg, errno); 
     cout << "2: " << msg << std::endl; 
     stop = true; 
    } 

    if (f->bad()) 
    { 
     char msg[500]; 
     strerror_s(msg, errno); 
     cout << "3: " << msg << std::endl; 
     stop = true; 
    } 

    return stop; 
} 

Попытка читать меньше 12800 байт работает отлично. От 128001 до 12966 он работает (хотя я не проверял, верны ли данные), но tellg() возвращает нечувствительность. После 12966, чтение просто не выполняется.

Консольный вывод эта программа:

12800 
16896 
1: No error 
2: No error 
-1 
Press any key to continue . . . 

Любая помощь будет оценена!

+0

Предполагаю, что вы используете VC++ в качестве своего компилятора из . Вы компилируете как 64-битные, так и 32-битные? – jaggedSpire

+0

32 бит, я не думал, что это будет иметь значение с такими низкими цифрами? – MyUsername112358

+0

Наверное, нет, но он попал под категорию «приятно знать» – jaggedSpire

ответ

3

В области окружающей среды и текстовых файлов для Windows, символ со значением 26 = 0x1A =^Z берется как «конец Ф.О. файл".

По этой причине, если файл не открыт как двоичный файл, может быть получен неожиданный eof, даже если файл больше.

См Википедию "Конец файла" (https://en.wikipedia.org/wiki/End-of-file):

В DOS Microsoft и Windows (и в CP/M и многих операционных систем DEC), чтение из терминала никогда не будет производить EOF. Вместо этого программы распознают, что источник является терминалом (или другим «символьным устройством») и интерпретирует данный зарезервированный символ или последовательность в качестве индикатора конца файла; чаще всего это ASCII Control-Z, код 26.

2

У вас есть файл размером 16,896 байт. Первое чтение прекрасно работает. Второе чтение встречает конец файла и может читать только 16 896 байт. Ваше третье чтение не удается, потому что вы не очистили конец файла в своем потоке.

У вас также может быть файл размером 120 МБ, но это не имеет значения. Проверьте размер файла в коде. (Или это может быть 120MB двоичных данных, но вы читаете его в текстовом режиме.)

+0

Файл 120 МБ ... Это больше, чем 16896 байт. – MyUsername112358

+0

@ MyUsername112358 Как вы это определили? Будьте как можно точнее. –

+0

myFile.seekg (0, std :: ios_base :: end); \t cout << "Размер файла:" << myFile.tellg() << std :: endl; // возвращает 123153562 – MyUsername112358

0

Вы писали

(хотя я не проверял, если данные верны)

Сделайте это, потому что я думаю, что данные верны.

Я предполагаю, что вы используете окна, так: Why can't Explorer decide what size a file is?

также https://superuser.com/questions/567175/why-is-the-folder-size-in-properties-different-from-the-total-file-folder-size

+1

Я знаю, что WIndows не показывает размер файла точно, но я сделал этот файл сам, и он стал больше, чем 16 896 байт. (Это avout 120 МБ) – MyUsername112358