从文本文件中解析和拆分

Parsing and split from a text file

我想从具有以下格式的文本文件中读取行: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;
      }
   }
}

但是它处理空格、逗号和换行符的地方。有关如何执行此操作的任何建议?

这不是最优雅的解决方案,但按照以下思路行事:

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().

以下所有方法都适用于您的案例:

您可以对每个字符串使用这样的例程。检查最后一个字符是否为逗号。如果是,请将其替换为 "empty-ness":

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)

您可以阅读带有 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
}

如果您的行被 space 打断,请使用 operator>> 而不是 std::getline()

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

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