2013-03-21 6 views
1

я стараюсь читать весь текстовый файл с помощью VC++ с этим кодомC++ Прочитайте весь текстовый файл

ifstream file (filePath, ios::in|ios::binary|ios::ate); 
    if (file.is_open()) 
    { 
     size = (long)file.tellg(); 
     char *contents = new char [size]; 
     file.seekg (0, ios::beg); 
     file.read (contents, size); 
     file.close(); 
     isInCharString("eat",contents); 

     delete [] contents; 
    } 

, но это не заманит весь файл целиком, почему и как справиться с этим?

Примечание: размер файла 1,87 MB и 39854 линия

+0

См. Следующую страницу http://stackoverflow.com/questions/2602013/read-whole-ascii-file-into-c-stdstring – woosah

+0

Возможный дубликат [Что является лучшим способом клонировать файл в std: : string в C++?] (http://stackoverflow.com/questions/116038/what-is-the-best-way-to-slurp-a-file-into-a-stdstring-in-c) –

ответ

0

Спасибо, я нашел ошибку, где просто код, приведенный ниже, читает весь файл, проблема была в VS watcher сама по себе, это просто отображение определенного количества данных, а не полного текстового файла.

0

Вы действительно должны получить привычку к чтению документации. ifstream::read документирована иногда не читать все байты, и

The number of characters successfully read and stored by this function 
    can be accessed by calling member gcount. 

Так что вы можете отлаживать ваши вопросы, глядя в file.gcount() и file.rdstate(). Кроме того, для таких больших чтений использование (в некотором явном цикле) функции члена istream::readsome может быть более актуальным. (Я бы предложил прочитать, например, куски 64 Кбайт).

PS Это может быть проблема с реализацией или системой.

2

Вы пропускаете следующую строку

file.seekg (0, file.end); 

перед:

size = file.tellg(); 
file.seekg (0, file.beg); 

Как вышеписанной в этом примере: http://www.cplusplus.com/reference/istream/istream/read/

+0

Thanmks, но я добавляю его, и никакая разница по-прежнему не входит в текст. – HokaHelal

+1

У вас всегда одинаковая сумма? Проверьте файл file.gcount() –

2

Другой способ сделать это:

std::string s; 
{ 
    std::ifstream file ("example.bin", std::ios::binary); 
    if (file) { 
     std::ostringstream os; 
     os << file.rdbuf(); 
     s = os.str(); 
    } 
    else { 
     // error 
    } 
} 

В качестве альтернативы вы можете использовать функции библиотеки C fopen, fseek, ftell, fread, fclose. С-api может быть быстрее в некоторых случаях за счет более STL-интерфейса.

Смежные вопросы