读取在某些行上带有前导制表符的制表符分隔文本文件

Reading a tab delimited text file with leading tabs on some lines

我正在构建一个基于控制台的电子表格应用程序,它将 UTF-8 编码的文本文件作为输入并将结果输出到控制台。

列值由制表符分隔,每一行都是一个新行。我在阅读以制表符分隔的输入文本文件时遇到一些问题,其中一些行(行)以制表符开头,表明第一列中没有值。我只想提取“填充”单元格并在程序的其他地方使用数据并丢弃或忽略“空”单元格。在 getline() 函数中使用 '\t' 分隔符似乎并没有忽略这些前导制表符。提前感谢您提供任何帮助或代码建议。

示例输入:

1 \t 2
\t 3
\t \t =A1+B1+B2 

我一直在使用的简单代码如下:

#include <iostream>
#include <stream>
#include <string>

// Variable declarations
std::ifstream sheetFile;
std::string input;

int main(int argc, char *argv[])
{
    sheetFile.open(argv[1]);
    while (getline(sheetFile, input, '\t'))
    {
        std::cout << input << std::endl;
    }

    sheetFile.close();
    return 0;
}

控制台的 return 是:

1
2

3


=A1+B1+B2

您可以使用多个 std::getline() 调用 - 一个在循环中读取由 \n 分隔的每一行,然后将每一行放入 std::istringstream 并使用 std::getline() 在 thaat 流上解析在 \t 上分隔的每一列,例如:

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

int main(int argc, char *argv[])
{
    // Variable declarations
    std::ifstream sheetFile(argv[1]);
    std::string line, input;

    while (std::getline(sheetFile, line))
    {
        std::istringstream iss(line);
        while (std::getline(iss, input, '\t'))
        {
            if (!input.empty())
                std::cout << input << std::endl;
        }
    }

    return 0;
}

或者,使用单个 std::getline(),您可以使用 std::ws 流操纵器忽略每行的前导空格,这将包括 \t\n 字符:

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

int main(int argc, char *argv[])
{
    // Variable declarations
    std::ifstream sheetFile(argv[1]);
    std::string input;

    while (std::getline(sheetFile >> std::ws, input, '\t'))
    {
        std::cout << input << std::endl;
    }

    return 0;
}