2015-05-28 3 views
1

У меня есть .idx файл, я хочу прочитать этот файл с помощью C++. Все элементы в этом файле разделены знаком \ 0. Я хочу получить этот список элементов. Я пытался реализовать его, как показано ниже:Как искать « 0» в двоичном файле?

while (file.read(buffer, sizeof buffer), chars_read = file.gcount()){ 

      string search_term = "\0";    
      string contentElement = buffer; 

      string::size_type foundoffset = contentElement.find(search_term); 

      if (foundoffset != string::npos){ 
       //Do something... 
      } 
     //code continue here. 
     ..... 
} 

Но в C++, «\ 0» считается нулевым, если вы имеете опыт работы с C++, пожалуйста, научи меня, как это сделать. Обратите внимание, что этот файл idx является двоичным файлом. Спасибо!

ответ

3

Не используйте std::string в двоичных файлах. Если вы работаете с необработанным массивом символов, найдите в нем, например, с std::find.

Например:

const char* end = buffer + chars_read; 
const char* ptr = std::find(buffer, end, '\0'); 

if(ptr == end) { 
    // not found 
} 
else { 
    // ptr points to null character 
} 
+0

Можете ли вы показать мне, как извлечь текст с начала на указатель ptr выше. Также файл idx имеет формат одного элемента: слово \ 0 - 4 байта число - 4 байта (\ 0 - знак для завершения слова, число с 4 байтами, затем еще одно число с 4 байтами). Можете ли вы научить меня, как получить слово, цифры в этом двоичном файле? Спасибо! – abelhoang

+0

Я решил это. извините за вопрос слишком простой вопрос! Я новичок в разработке C++ – abelhoang

3

Если buffer является массив символов (например char buffer[...]), то конструкция contentElement строки не будет читать только до '\0' в buffer.

Однако есть std::string constructor, который позволяет установить содержимое строки с длиной, которую вы должны использовать, если содержащаяся строка может содержать встроенный терминатор символы:

std::string contentElement(buffer, chars_read); 

Хотя для своей цели я предлагаю вы держитесь подальше от std::string и просто выполните поиск в буфере напрямую. Например, с std::find.

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