2016-05-01 62 views
3

我想從具有以下格式的文本文件行讀取分裂:a r3, r2, r1,我想這樣我有持有,R3,R2一個變量來把它們分割各個部分,並r1,所以我需要刪除空格和逗號。我不知道如何做到這一點。我搜索周圍,但只能找到實例(如this)與預先定義的字符串。解析和從文本文件

我知道如何從文件中讀取文本,並把它變成一個字符數組,但理想的我想一個行中的每個元素放入一個單獨的變量。

因此,像:

#include <iostream> 
#include <string> 
#include <fstream> 
using namespace std; 

void main() 
{ 
    string var1, var2, var3, var4; 
    ifstream inFile("myfile.txt"); 

    if (inFile.is_open()){ 
     while (!inFile.eof()){ 
     inFile >> var1 >> var2 >> var3 >> var4; 
     } 
    } 
} 

但如果它處理空格,逗號和新線。有關如何做到這一點的任何建議?

+1

首先,[不這樣做:'而(!inFile.eof())'](https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-一個循環條件考慮的,是錯誤的)。 – WhozCraig

+0

'與string.replace()?'由空岬逗號。甚至更好的'string.erase()'逗號。 'string.pop_back()'最後一個字符? –

回答

1

您可以用std::getline(<stream>, <string>)讀一行。

std::string line; 
while(std::getline(inFile, line)) 
{ 
    // You successfully read a line. 
} 

實際上有到std::getline()第三參數,用於指定線的端部。默認情況下這是'\ n',但是你指定了你的行結束(這將是',')。

std::stringstream lineStream(line); // convert your line into a stream. 

if (std::getline(lineStream, a, ',') && 
    std::getline(lineStream, r1, ',') && 
    std::getline(lineStream, r2, ',') && 
    std::getline(lineStream, r3, ',') 
    ) 
{ 
    // Read all the values successfully 
} 

如果線是由空間打散使用operator>>,而不是std::getline()

std::stringstream lineStream(line); // convert your line into a stream. 

if (lineStream >> a >> r1 >> r2 >> r3) 
{ 
    // Read all the values successfully 
} 
+0

林不知道我按照你的意思與在線結束','。如果我的行是(空格)ra,ra,rc,那麼除\ n之外,沒有行結束將被讀取。 – Noobgineer

+0

std :: getline()的第三個參數是它將停止讀取的字符。默認情況下,它停止在''\ n'',但你可以使用任何其他字符(如'','')。如果你的單詞a用空格隔開,使用'operator >>' –

+0

我的行用空格和逗號分隔,如問題所示:a(空格)r1,(空格)r2,(空格)r3 \ n – Noobgineer

0

不是最優雅的解決方案但沿着這些路線的東西會工作:

void parse_input(const std::string& _buffer, std::string& _s1, std::string& _s2, 
std::string& _s3, std::string& _s4); 

int main(void) { 
    std::ifstream inFile("foo.txt"); 

    std::string var1, var2, var3, var4; 
    std::string buffer = ""; 
    while(std::getline(inFile, buffer)) { 
     parse_input(buffer, var1, var2, var3, var4); 
    } 
} 

void parse_input(const std::string& _buffer, std::string& _s1, std::string& _s2, 
std::string& _s3, std::string& _s4) { 
    size_t count = 0; 
    // increment count until first space char 
    while (buffer.at(count) != ' ') { 
     ++count; 
    } 
    // set _s1 to substring of _buffer from start to first space 
    _s1 = _buffer.substr(0, count); 
    size_t prev_count = count; 
    // repeat above for comma char instead... 
    while (buffer.at(count) != ',') { 
     ++count; 
    } 
    _s2 = _buffer.substr(prev_count, count); 
    prev_count = count; 
    while (buffer.at(count) != ',') { 
     ++count; 
    } 
    _s3 = _buffer.substr(prev_count, count); 
    prev_count = count; 
    while (buffer.at(count) != ',') { 
     ++count; 
    } 
    _s4 = _buffer.substr(prev_count, count); 
} 

請注意,這並不妨礙索引越界的錯誤在parse_input_buffer爭論 - 你需要添加額外的檢查在while循環如&& count < _buffer.size()

1

下面所有的方式爲你的情況下工作:

可以使用等日常每一個字符串。檢查最後一個字符是否是逗號。如果是,與「空性」替換:

if (var1[var1.size() - 1] == ',') 
    var1.replace(var1.size() - 1, var1.size() - 1, ""); // (From index, to index, with) 

可以pop_back()的最後一個字符,如果它是一個逗號:

if (var2[var2.size() - 1] == ',') 
    var2.pop_back(); 

此外,你可以刪除,如果它的逗號是最後一個字符:

if (var3[var3.size() - 1] == ',') 
    var3.erase(var3.size() - 1, var3.size() - 1); // (From index, to index) 
+0

這是否處理空格? – Noobgineer

+0

@noobgineer'inFile >> var1'默認情況下忽略空格 –

+0

如果我有不同數量的變量,那麼可以說一行只有3個元素,或者另一個有5個元素,我只需聲明最大數量的變量i需要而不用擔心var5不會讀取任何內容? – Noobgineer