2009-11-23 3 views
0

Я прочитал весь файл в строку из памяти сопоставляется файл Win APIC++ Разбор строки из большого файла

CreateFile("WarandPeace.txt", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) 

и т.д ...

Каждая строка завершается с CRLF , Мне нужно найти что-то на строке типа «Спам» в строке «Я люблю спам и яйца» (и вернуть всю строку (без CRLF) в строку (или указатель на местоположение в строке) Исходная строка не может быть изменен

EDITED:.

Что-то вроде этого:.

string ParseStr(string sIn, string sDelim, int nField) 
{ 
    int match, LenStr, LenDelim, ePos, sPos(0), count(0); 
    string sRet; 

     LenDelim = sDelim.length(); 
     LenStr = sIn.length(); 
     if(LenStr < 1 || LenDelim < 1) return ""; // Empty String 
     if(nField < 1) return ""; 
     //=========== cout << "LenDelim=" << LenDelim << ", sIn.length=" << sIn.length() << endl; 


     for(ePos=0; ePos < LenStr; ePos++) // iterate through the string 
     { // cout << "sPos=" << sPos << ", LenStr=" << LenStr << ", ePos=" << ePos << ", sIn[ePos]=" << sIn[ePos] << endl; 
      match = 1; // default = match found 
      for(int k=0; k < LenDelim; k++) // Byte value 
      { 
       if(ePos+k > LenStr) // end of the string 
        break; 
       else if(sIn[ePos+k] != sDelim[k]){ // match failed 
        match = 0; break; } 
      } 
      //=========== 

      if(match || (ePos == LenStr-1)) // process line 
      { 
       if(!match) ePos = LenStr + LenDelim; // (ePos == LenStr-1) 
       count++; // cout << "sPos=" << sPos << ", ePos=" << ePos << " >" << sIn.substr(sPos, ePos-sPos) << endl; 
       if(count == nField){ sRet = sIn.substr(sPos, ePos-sPos); break; } 
       ePos = ePos+LenDelim-1; // jump over Delim 
       sPos = ePos+1; // Begin after Delim 
      } // cout << "Final ePos=" << ePos << ", count=" << count << ", LenStr=" << LenStr << endl; 
     }// next 

    return sRet;  
} 

Если вам это нравится, проголосуйте за него Если нет, то давайте посмотрим, что вы получили

+1

CreateFile() не отображает карту памяти. Это только открывает его. Вы на самом деле вызываете CreateFileMapping() и MapViewOfFile() после этого? –

+1

Еще один запутанный аспект: если вы на самом деле карте памяти, то зачем копировать его в строку? –

+0

Это упражнение при разборе. Но есть моменты, когда вам нужно разбирать строки из файла с отображением памяти или даже ответа от HTTP-запроса и т. Д. –

ответ

2

Если. вы пытаетесь сопоставить более сложный шаблон то вы всегда можете вернуться к regex lib.

См: http://www.boost.org/doc/libs/1_41_0/libs/regex/doc/html/index.html

#include <iostream> 
#include <string> 
#include <boost/regex.hpp> 

using namespace std; 

int main() 
{ 
    std::string s; 
    std::string sre("Spam"); 
    boost::regex re; 

    ifstream in("main.cpp"); 
    if (!in.is_open()) return 1; 

    string line; 
    while (getline(in,line)) 
    { 
     try 
     { 
     // Set up the regular expression for case-insensitivity 
     re.assign(sre, boost::regex_constants::icase); 
     } 
     catch (boost::regex_error& e) 
     { 
     cout << sre << " is not a valid regular expression: \"" 
      << e.what() << "\"" << endl; 
     continue; 
     } 
     if (boost::regex_match(line, re)) 
     { 
     cout << re << " matches " << line << endl; 
     } 
    } 
} 
+0

Насколько эффективна эта библиотека? –

+0

sre никогда не инициализируется; и шаблон никогда не используется. – ScottJ

+0

@ScottJ, спасибо, что это был псевдокод, я его обновил. – chollida

-1

система ("Grep ....");

+0

Не так ли просто вернуть счет? Возможно, вы можете расширить ... –

+0

Это в Windows (Win API). Определенно нет «grep» ... – billyswong

0

Вам действительно нужно это делать на C++? Возможно, вы могли бы использовать язык, который более подходит для обработки текста, например Perl, и применять регулярное выражение.

В любом случае, если это сделать в C++, цикл над Prev_delim_position = sIn.find(sDelim, Prev_delim_position) выглядит как прекрасный способ сделать это.

+0

Да C++ - это язык, который я должен использовать для этого. Эта концепция вашего метода - это то, что я имел в виду, но используя указатели вместо .find() –

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