2016-02-03 3 views
1

У меня есть двоичный файл text.bin. Текст внутри написан следующим образом: 4helo5hello6helloo. Если бы я не знал, что внутри есть 3 строки, , как бы я узнал? Я хочу сделать динамический массив строк из двоичного файла , но сначала я должен знать, сколько строк в файле. Я знаю, что я могу читать это так:Как узнать, сколько строк записано в двоичный файл?

ifstream dat("text.bin", ios_base::binary); 
if (!dat) 
{ 
    cout << "Error"; 
    return 1; 
} 
int temporary; 
dat.read((char*)(&temporary), sizeof(temporary)); 
char *arrray = new char[temporary]; 
dat.read(arrray, temporary); 
string word = string(arrray, temporary); 

Как бы я сделать это в петлю, так что он читает до тех пор, пока что-то читать в двоичный файл? Как бы я узнал, сколько слов есть, чтобы я мог подготовить динамический массив для слов? Я использую:

#include <iostream> 
#include <string> 
#include <fstream> 
using namespace std; 

ответ

1

Держите его простым. Если бинарный формат похож на то, что вы сказали: 4helo5hello6helloo, например, выполните следующие действия;

Прочитайте первое число,

подстроки с позиции первого номера в сколь угодно долго строке (номер, который вы читаете),

Поместите подстроку в двумерный массив (один размер для количества строк, другое для длины строк),

Промыть ополаскивание до тех пор, пока вы не достигнете конца файла.

Длина первого измерения массива - это количество строк в файле. Теперь массив содержит все строки в файле чтения.

Cheers!

+0

Таким образом, вы имеете в виду, что я использую seekg (+ length) и чем counter ++? – Kira

+0

Посмотрите команду подстроки. – user1973385

0

Для 4helo5hello6helloo, написать отдельную функцию перебрать word и при каждом числовом значении увеличивает индекс строки массива по этому значению и приращение word_counter variable на 1, чтобы получить количество слов в файле.

Пропущенные индексы содержат ваши слова (возможно, записывают их в другой массив).

read() функция имеет тип возвращаемого size_t и возвращает число байтов, считанных из файла, где возвращаемое значение 0 означает, что конец файла достигнут.

int not_end = 1; 
while (not_end) 
{ 
    not_end = dat.read((char*)(&temporary), sizeof(temporary)); 
    char *arrray = new char[temporary]; 
    dat.read(arrray, temporary); 
    string word = string(arrray, temporary); 
    // Note that word will get overwritten each time the loop is run 
    // Store word in an array of Strings and keep incrementing index 
} 
+0

Итак, я должен использовать вектор, или если я хочу использовать динамическое поле, я бы просто подсчитал, сколько раз цикл работал до конца, и использовать этот счетчик для создания нового динамического массива? – Kira

+0

Вы можете запустить цикл один раз в начале и использовать этот счетчик для создания массива. Затем вы можете использовать массив позже, чтобы добавить слова, когда идете. Сделайте отметку как принятую, если это решит вашу проблему :-) –

+0

нет подходящей функции преобразования из «std :: basic_istream >" to "int" существует. Кажется, я не могу положить символ в int. Я не могу написать not_end = dat.read ... – Kira

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