2017-04-14 69 views
0

當我試圖連接兩個字符串時,第二個字符串替換了第一個字符串的第一個字母。字符串串聯取代了前幾個字符

我使用getline函數從文件中獲取輸入,正則表達式在行中挑選9位數字的「UIN」,並嘗試將另一個字符串追加到原始完整行上。例如:

string line; 
    ifstream in(infile); 
    ofstream out("output.csv"); 
    getline(in, line); 
    regex pat("(\\d{9})"); 
    smatch matches; 

    if(regex_search(line, matches, pat)) 
    { 

     line += ",65"; 

     cout<<line<<endl; 
     out<<line<<endl; 

    } 

(當然Im做其他的事情在此聲明,但沒有對串線經營,所以我離開它了)

原線

Alfonso Livingston,[email protected],800000092 

,返回是

,65onso Livingston,[email protected],800000092 

我看到this link,並試圖創造新的字符串即(?)(line += string(",65")),但它都以相同的結果結束。我也嘗試使用append函數和push_back函數。任何幫助將非常感激!

編輯:

這是我的全部功能。輸入來自逗號分隔值列表input.csv。我真的不能複製這個功能,所以我不知道我能否給出一個完整的可驗證的例子。

void combine(string infile) 
{ 
    ifstream in(infile); 
    ofstream out("output.csv"); 
    int size = getSize(infile); 
    int hashVal; 
    string line; 
    string listVals; 
    getline(in, line); 
    regex pat("(\\d{9})"); 
    smatch matches; 


    if(regex_search(line, matches, pat)) 
    { 

     hashVal = hash(stoi(matches[0])); 
     listVals = table[hashVal].getFirst()->getElem(); 
     line += ",65"; 
     cout<<line<<endl; 
     out<<line<<endl; 

    } 


} 

這不是整個完成的功能所要做的,但它是我不得不停下來弄清楚這個問題的地方。

+1

正則表達式與您所描述的問題無關。你爲什麼包括它(或標籤)?你不是使用正則表達式連接,你不是用正則表達式提取任何東西;在這個問題中沒有任何與正則表達式相關的東西,除了你在'if'中使用它。 –

+0

[我無法複製它](http://ideone.com/6FNjsy)。你需要給我們更多的細節,最好是[最小,完整和可驗證的例子](http://stackoverflow.com/help/mcve)。 –

+0

這是我第一次使用正則表達式,所以我不確定在正則表達式搜索中是否可能導致它。如果確實不是問題,我可以刪除標記 – user7497136

回答

0

你實際上並沒有寫入字符串的開頭,這就是你的終端如何顯示一個'\r'字符。

在Windows上,文本文件使用'\ r'和'\ n'(ASCII碼點0x0D0x0A)這兩個字符來指示行結束。類Unix操作系統只使用'\ n'字符。如果您使用的是使用Unix樣式行結尾構建的庫,併爲其提供了一個帶有Windows樣式行結尾的文件,那麼當您使用std::getline時,最終會在字符串末尾添加一個額外的'\ r'字符。當您向終端打印'\ r'字符時,它會將光標移回到行的開頭,因此在'\ r'字符後面的輸出的其餘部分將被寫入字符串的開頭。

拿這個例子:

如果我有文件foo。TXT與內容

這是一些文本
這是一些更多的文本

我運行下面的程序:

#include <iostream> 
#include <fstream> 
#include <string> 

int main() { 
    std::string line; 
    std::ifstream in("foo.txt"); 
    std::ofstream out("foo.out"); 
    std::getline(in, line); 

    line += "foo"; 
    std::cout << line << '\n'; 
    out << line << '\n'; 
} 

我看到以下打印到終端:

foos是一些文字

如果我們更關注一些,該文件包含的Windows風格的行結束符:

$ xxd foo.txt 
00000000: 7468 6973 2069 7320 736f 6d65 2074 6578 this is some tex 
00000010: 740d 0a74 6869 7320 6973 2073 6f6d 6520 t..this is some 
00000020: 6d6f 7265 2074 6578 740d 0a    more text.. 

的通知「0D0A」對每一行的末尾。此外,「foo.out」包含此:

$ xxd foo.out 
00000000: 7468 6973 2069 7320 736f 6d65 2074 6578 this is some tex 
00000010: 740d 666f 6f0a       t.foo. 

你可以看到,我添加到字符串的「富」是不是在所有的開始,但在最後一個「\ r」字符後。爲了避免這個問題

一種方法是檢查,如果你行的最後一個字符是「\ r」和若然彈出它關閉:

if (line.back() == '\r') { 
    line.pop_back(); 
} 

更好的方法是將行結束轉換在您的輸入文件中以匹配您的環境。

+0

解決!我只需要創建一個子字符串來切斷行的最後一個字符。感謝所有幫助過我的人 – user7497136