从文本文件中解析和拆分

时间:2016-05-01 22:31:11

标签: c++ parsing fstream delimiter

我想从具有以下格式的文本文件中读取行:a r3, r2, r1并且我想将其拆分为单个部分,因此我有一个变量分别保存a,r3,r2和r1,所以我需要删除空格和逗号。我不知道该怎么做。我已经搜索过,但只能找到带有预定义字符串的示例(例如this)。

我知道如何从文件中读取文本并将其放入char数组中,但理想情况下我想将一行的每个元素放入一个单独的变量中。

类似于:

#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;
      }
   }
}

但它处理空格,逗号和新行。有关如何做到这一点的任何建议吗?

3 个答案:

答案 0 :(得分:1)

以下所有方式适合您的情况:

您可以为每个字符串使用此类例程。检查最后一个字符是否为逗号。如果是,请将其替换为&#34; empty-ness&#34;:

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)

答案 1 :(得分: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
}

答案 2 :(得分: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);
}

请注意,这并不能防止_buffer parse_input参数中的索引超出范围错误 - 您需要在while循环中添加其他检查,例如{ {1}}。