2015-12-27 3 views
0

Я попытался создать программу, которая загружает куски большого (мы говорим о нескольких МБ) файла и ищет значение и печатает его адрес и значение, кроме моя программа каждые несколько раз бросает myfile, не дает значения, кроме странного символа (хотя я использовал «hex» в cout), адреса кажутся петлями sorta, и, похоже, не все значения вообще. Я пробовал в течение долгого времени, и я сдался, поэтому я спрашиваю, есть ли у кодов программы, чтобы найти проблему. Я должен отметить, что я пытаюсь найти 32-битное значение в этом файле, но все, что я мог сделать, это программа, которая проверяет байты, и мне тоже потребуется помощь.Поиск значения int в большом двоичном файле C++

#include <iostream> 
#include <fstream> 
#include <climits> 
#include <sstream> 
#include <windows.h> 
#include <math.h> 

using namespace std; 

int get_file_size(std::string filename) // path to file 
{ 
    FILE *p_file = NULL; 
    p_file = fopen(filename.c_str(),"rb"); 
    fseek(p_file,0,SEEK_END); 
    int size = ftell(p_file); 
    fclose(p_file); 
    return size; 
} 

int main(void) 
{ 
    ifstream myfile; 

    myfile.open("file.bin", ios::binary | ios::in); 


    char addr_start = 0, 
         addr_end = 0, 
         temp2  = 0x40000; 

    bool found = false; 

    cout << "\nEnter address start (Little endian, hex): "; 
    cin >> hex >> addr_start; 
    cout << "\nEnter address end (Little endian, hex): "; 
    cin >> hex >> addr_end; 

    unsigned long int fsize = get_file_size("file.bin"); 
    char buffer[100]; 

    for(int counter = fsize; counter != 0; counter--) 
    { 
     myfile.read(buffer,100); 
     if(!myfile) 
     { 
      cout << "\nAn error has occurred. Bytes read: " << myfile.gcount(); 
      myfile.clear(); 
     } 
     for(int x = 0; x < 100 - 1 ; x++) 
     { 
      if(buffer[x] >= addr_start && buffer[x] <= addr_end) 
          cout << "Addr: " << (fsize - counter * x) << " Value: " << hex << buffer[x] << endl; 
     } 

    } 

    myfile.close(); 
    system("PAUSE"); //Don't worry about its inefficiency 
} 
+1

1. Несколько МБ не большой файл :) 2. Вам не нужно использовать старый API C, чтобы получить размер файла: http://stackoverflow.com/a/5840160/634821 –

+0

3. Вы зацикливаете байтовый файл байтом, но читаете его в кусках по 100 байт каждый раз. Учитывая, что ваши файлы на самом деле не так долго, я бы просто обработал байты байтом, без 100-байтового буфера. Путь проще. –

+0

Ваша стоимость 1 байт? Что именно вам нужно делать? –

ответ

3

Простая программа для поиска 32-разрядного целого числа в двоичном файле:

int main(void) 
{ 
    ifstream data_file("my_file.bin", ios::binary); 
    if (!data_file) 
    { 
    cerr << "Error opening my_file.bin.\n"; 
    EXIT_FAILURE; 
    } 
    const uint32_t search_key = 0x12345678U; 
    uint32_t value; 
    while (data_file.read((char *) &value, sizeof(value)) 
    { 
    if (value == search_key) 
    { 
     cout << "Found value.\n"; 
     break; 
    } 
    } 
    return EXIT_SUCCESS; 
} 

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

//... 
const unsigned int BUFFER_SIZE = 1024; 
static uint32_t buffer[BUFFER_SIZE]; 
while (data_file.read((char *)&(buffer[0]), sizeof(buffer)/sizeof(uint32_t)) 
{ 
    int bytes_read = data_file.gcount(); 
    if (bytes_read > 0) 
    { 
    values_read = ((unsigned int) bytes_read)/sizeof(uint32_t); 
    for (unsigned int index = 0U; index < values_read; ++index) 
    { 
     if (buffer[index] == search_key) 
     { 
     cout << "Value found.\n"; 
     break; 
     } 
    } 
    } 
} 

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

+0

Вау, это, безусловно, интересно. Хотя вы забыли закрыть брекет, я впечатлен. Это было полезно, очень полезно.Первый был довольно легко поймать, но второй, кажется, сложнее понять, я дам ему более глубокий взгляд. Тем не менее, хотя он и находит ценности, у него есть проблемы с их поиском. Некоторое значение, присутствующее в файле 31 раз, было найдено только 3 раза, возможно из-за того, что размер файла является проблемой? (56 МБ). Спасибо за помощь. –

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