2015-11-05 5 views
0

Эй, я хотел найти подстроку «Step1» в файле и обыскал ее с моим кодом. Хотя этот файл содержит NULL-символы (в основном символы HEX). С этими символами Null в моем файле мой синтаксический анализатор терпит неудачу и возвращает true. Я пробовал и искал много материала о замене и удалении символов NULL, но все было напрасно. Это мой парсер:Поиск подстроки в String среди NULL символов в текстовом файле

char *str="Step1"; 
fp=fopen(fname, "rb"); 
if(NULL == fp) 
    return(-1); 
while(fgets(temp, 400, fp)!= NULL) 
{ 
    if((strstr(temp, str1))!= NULL) 
     { 
      system("start Step1.bat"); 
      count_step[0]++; 
     } 
} 
if(fp) 
    fclose(fp); 

Это как мой текстовый файл выглядит следующим образом:

NULLNULLNULLNULLStep1NULLNULLNULL 
NULLNULLStep1 

Просьба предложить мне быстрое решение, которое я могу включить

+0

Если файл является текстовым файлом, то почему вы открываете его в двоичном режиме? Это может помешать работе 'fgets' работать должным образом. И если файл на самом деле не является текстовым файлом, а 'NULL', который вы показываете нам, фактически является бинарным нулем, тогда вы не можете использовать текстовые функции, такие как' fgets' или 'strstr'. Не могли бы вы прояснить? –

+1

Было бы хорошо, если бы вы не использовали строковые функции и не записывали свой собственный «strstr». Таким образом, вы можете обрабатывать символы NULL или любые другие символы, как вы пожелаете. – Abhineet

+0

@JoachimPileborg Я только что проверил, открыв его в двоичном режиме, если это имеет значение. Да, это текстовый файл – naruto

ответ

2

Если файл является двоичным вы можете Не используйте функции обработки строк, такие как fgets или strstr.

Одним из возможных (и замедленных) решений является считывание фрагмента данных с использованием fread, затем поиск «строки» с использованием memcmp по всем данным в файле. В качестве очень простой оптимизации сначала найдите первый байт в строке, а затем используйте memcmp.

Другие решения могут включать в себя поисковые деревья, такие как a trie.

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