2013-03-10 4 views
2

В моей лабораторной работе мы должны читать данные из txt и записывать их в .dat-файл в виде двоичного формата, тогда мы должны искать и находить данные по заданному идентификатору в двоичном файле. Наш worker.txt файл в этом форматеЧтение и поиск данных из двоичного файла

:

ID firstname lastname age salary 

как:

341 Alex Morgan 32 3400 
234 Jessica Gibson 28 2000 
... 

Программа считывает эти ДАННЫЕ записывает все они worker.dat в виде двоичного файла.

Проблема заключается в том, когда введен правильный идентификатор для поиска программы, найдите и распечатайте ее, а затем закройте с ошибкой завершения работы Windows, мне нужна ваша помощь для ее обработки. Функция

Мои searchByID:

void searchByID(int key) 
{ 
bool find=false; 
int id,age,sal; 
string fn,ln; 
ifstream InFile; 
InFile.open("worker.dat", ios::in | ios::binary); 
int i = getSize(initialArr); 
int j; 
for(j=0; j<i; j++){ 
    InFile.read((char*)&id, sizeof(int)); 
    InFile.read((char*)&fn, sizeof(string)); 
    InFile.read((char*)&ln, sizeof(string)); 
    InFile.read((char*)&age, sizeof(int)); 
    InFile.read((char*)&sal, sizeof(int)); 
    if(id == key) 
    { 
     cout << "Datas for Entered ID:\n" 
      << id <<" "<< fn <<" " 
      << ln <<" "<< age <<" " 
      << sal << endl; 
     find = true; 
    } 
} 
if(!find) 
    cout << "Entered ID not Found on File" << endl; 
InFile.close(); 
} 
+3

Это текстовый файл не бинарный файл. – Hogan

+0

Вы описываете формат 'worker.txt', но не формат' worker.dat' – Hogan

+0

Сначала программа считывает данные из файла txt, затем записывает всю информацию в двоичный файл, вы можете получить двоичный файл по этой ссылке: http: // www.speedyshare.com/97mth/worker.dat –

ответ

2

Делать что-то вроде этого не будет работать:

InFile.read((char*)&fn, sizeof(string)); 

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

+0

+1 Он также должен использовать значения известной ширины (uint32_t и т. Д.).) и, в идеале, упорядочивают их до записи, де-упорядочивая их при чтении, если нет интереса к переносимости. – WhozCraig

+0

Благодарим вас за ответ после того, как все строки были перенесены в программу char array. –

1

Здесь, как я уже сказал, в комментариях описывается формат work.txt и чтение из файла с именем worker.dat. Являются ли они одного формата? Если нет, вы читаете текстовый файл. Если это так, вы не знаете длину строк, но я бы предположил, что они завершены нулем.

Ниже приведен пример одной из ваших проблем. Sizeof (string) всегда будет размером указателя, а не длиной строки, которую вы читаете.

Если это текстовый файл, что вы хотите сделать это:

  • Читать строку из текстового файла.

  • Анализировать, что линия