簡體   English   中英

對待用空格(或制表符)分隔的文件“ like”和數組-C ++

[英]Treat a space(or tab) separated file “like” and array - C++

我有一個簡短的制表符/空格分隔文件(可以相應地創建),結構如下

[data00] <space> [data01] <space> [data02] <space> [data03] <newline>
[data10] <space> [data11] <space> [data12] <space> [data13] <newline>
...

第一列代表數字ID。 我創建此文件以將其提供給另一個可執行文件,因此格式是固定的。 送入文件后,可執行文件將輸出另一個具有類似結構的文件:

[data00] <space> [data01]<newline>
[data10] <space> [data11]<newline>
...

給定的ID,我需要讀取相應的[dataX1]執行操作[dataX3]在第一文件中,其反饋到可執行,和迭代。

我想到了兩種方法:

  • 給定兩個文本文件的結構是固定的,對其進行操作就好像它們是數組一樣,但是對於使用哪種函數/語法我卻迷失了。 這應該是一個小函數,它允許我通過傳遞相關的數字ID來隱藏所有討厭的I / O代碼來讀取有趣的位,因為我可能需要在不同的上下文中重復很多此操作
  • 將第一個文件保留在數組中,並通過向可執行文件提供流來欺騙可執行文件(這可能嗎?可執行文件需要文件作為參數)。

我可以很容易地將文件讀取到數組中,並每次都重新寫入文件,但是我想避免無用的讀取和寫入操作,因為我每次需要讀/寫的只是一個單元。 我現在不要做的是,當我使用getline從文本文件中讀取整行內容時,如何停止/識別興趣位。

首先,我們將編寫一個函數,該函數將基於給定的分隔符拆分輸入的字符串。 (在這種情況下,我們將使用空間。)

int split(const std::string& line, const std::string& seperator, std::vector<std::string> * values){
    std::string tString = "";
    unsigned counter = 0;
    for(unsigned l = 0; l < line.size(); ++l){
        for(unsigned i = 0; i < seperator.size(); ++i){
            if(line[l+i]==seperator[i]){
                if(i==seperator.size()-1){
                    values->push_back(tString);
                    tString = "";
                    ++counter;
                }else continue;
            }else{
                tString.push_back(line[l]);
                break;
            }
        }
    }
    return counter;
}

現在,我們將為自己編寫一個簡單的主體來讀取文件,使用split對其進行分解,然后根據其在文件中的位置輸出數據。

int main(){
    std::vector<std::vector<std::string> > lines;
    std::string tString = "";
    std::vector<std::string> tVector;
    std::ifstream fileToLoad;

    fileToLoad.open(FILE_NAME);

    if(fileToLoad.is_open()){
        while(std::getline(fileToLoad,tString)){
            split(tString, " ", &tVector);
            lines.push_back(tVector);
            tVector.clear();
        }

        //Now print our output.
        for(unsigned i1 = 0; i1 < lines.size(); ++i1){
            for(unsigned i2 = 0; i2 < lines[i1].size(); ++i2){
                std::cout<<"["<<i1<<","<<i2<<"] = "<<lines[i1][i2]<<std::endl;
            }
        }
    }else{
        std::cerr<<"FAILED TO OPEN FILE: "<<FILE_NAME<<std::endl;
        return 1;
    }
    return 0;
}

我使用的輸入文件包含以下數據:

450 105 10 10.5 -10.56001 23
10 478 1290 384 1289 3489234 1 2 3 4 5
1 2 3 4 5 6.1 19 -1.5

輸出結果為:

[0,0] = 450
[0,1] = 105
[0,2] = 10
[0,3] = 10.5
[0,4] = -10.56001
[1,0] = 10
[1,1] = 478
[1,2] = 1290
[1,3] = 384
[1,4] = 1289
[1,5] = 3489234
[1,6] = 1
[1,7] = 2
[1,8] = 3
[1,9] = 4
[2,0] = 1
[2,1] = 2
[2,2] = 3
[2,3] = 4
[2,4] = 5
[2,5] = 6.1
[2,6] = 19

現在,您所需要做的就是使用您喜歡的解析算法將每個字符串更改為雙精度型。 (strtod,atof等),取決於優化的重要性,您還可能希望根據用例從vector修改容器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM