2016-05-01 63 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