2015-10-13 124 views
1

讓我們從頭開始,我對C++完全沒有經驗,但是我得到了這個項目來連接一個POS和一個verifone。我們沒有標準的驗證SDK,但有一些自定義的。分割讀取文件C++

首先,我需要準備好要發送到C++的數據,C++會將它發送到Verifone。這是我卡住的地方,我有一個.txt文件,我可以用C++讀取,但現在我需要分割數據。

這是我當前的代碼:

#include "stdafx.h" 
#include <sstream> 
#include <iostream> 
#include <fstream> 
#include <vector> 

using namespace std; 

string file_get_contents(const char *filename) 
{ 
    ifstream in(filename); 
    if (in.fail()) 
    { 
     cerr << "File not found: " << filename << endl; 
     return ""; 
    } 

    std::stringstream buffer; 
    buffer << in.rdbuf(); 
    in.close(); 
    return buffer.str(); 
} 

int main(int argc, char **argv) 
{ 

    vector<string> strings; 

    string contents = file_get_contents("C:/wamp/www/cmd/config.txt"); 

    string s; 
    while (contents, s, '||') { 
     cout << s << endl; 
     strings.push_back(s); 
    } 

    cout << s; // ECHO CONTENTS 
    std::cin.ignore(); // pause 
    return 0; 
} 

有了這個代碼我的控制檯只是停留空白,正在顯示的數據。 滿弦我分裂是:

"notepad://amount=10320.53||session_id=7946548443287465/" 

,我想要的結果是獲得一個使用「量」和「SESSION_ID」爲鍵,作爲值值的數組。

達到此目的的最佳方法是什麼?

我用下面的代碼來實際顯示在我的控制檯中的字符串這是工作:

int main(int argc, char **argv) 
{ 
    string contents = file_get_contents("config.txt"); 
    cout << contents; // ECHO CONTENTS 
    std::cin.ignore(); // pause 
    return 0; 
} 
+0

這聽起來像你可能需要學習如何使用調試器來逐步通過你的代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:** [如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+0

您使用的是哪種C++版本?如果你使用C++ 11,你可以使用[正則表達式](http://www.cplusplus.com/reference/regex/)。 – Schrieveslaach

+2

'while(contents,s,'||')'這個條件應該做什麼? –

回答

1

這顯示瞭如何使用正則表達式來提取所需的信息,那裏有很多的網上資源如何正確讀取文件,所以我把這部分留下了。

#include <iostream> 
#include <regex> 
#include <unordered_map> 
#include <string> 

int main(int argc, char **argv) 
{ 
    std::regex pattern("amount=([[:digit:]\\.]*)\\|\\|session_id=([[:digit:]]*)"); 
    std::smatch results; 
    std::unordered_map<std::string, std::string> data; 

    std::string contents = "notepad://amount=10320.53||session_id=7946548443287465/"; 
    //string contents = file_get_contents("C:/wamp/www/cmd/file.txt"); 
    if(std::regex_search(contents, results, pattern)) 
    { 
     data["amount"] = results[1]; 
     data["session_id"] = results[2]; 
    } 
    std::cout << "Amount: " << data["amount"] << std::endl; 
    std::cout << "Seesion ID: " << data["session_id"] << std::endl; 

    return 0; 
} 
+0

不知怎的,這是我的激活的反病毒和刪除我的.exe .... – killstreet

+0

@killstreet這是奇怪的,這個代碼不訪問文件或任何東西的本身之外這裏http://ideone.com/CBBnpP –

+0

@killstreet行:如果(std :: regex_search(contents,results,pattern))導致錯誤發生,試圖檢查它爲什麼會這樣做。 –