如何逐字逐行地读取文件的第一行和其他行作为变量的逐行存储?

时间:2016-09-26 15:51:51

标签: c++

文件的内容格式如下

 
3 3
ABCD 
ABCD
ABCD
... 

我想读变量k中的第一个数字,另一个变量中的另一个数字说n。我希望存储在字符串中的其余行说seq以便

k = 3
n = 3
seq = ABCDABCDABCD..

我需要在c ++中这样做。我刚开始学习c ++。我知道如何逐行逐字阅读文件,但我不知道如何以这种特定格式读取文件。

1 个答案:

答案 0 :(得分:0)

执行每行验证时,使用std::istringstream分隔行,然后执行常规流操作。

例如,给定一个程序将输入文件作为唯一参数:

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

int main(int argc, char *argv[])
{
    if (argc < 2)
        return EXIT_FAILURE;

    std::ifstream inp(argv[1]);

    // first line
    std::string line;
    if (std::getline(inp, line))
    {
        // load into string stream for parsing.
        std::istringstream iss(line);
        int k, n;
        if (iss >> k >> n)
        {
            // remaining lines dumped into seq
            std::string seq;
            while (std::getline(inp, line))
                seq.append(line);

            // TODO: use k, n, and seq here
        }
        else
        {
            std::cerr << "Failed to parse k and/or n\n";
        }
    }
    else
    {
        std::cerr << "Failed to read initial line from file\n";
    }
}

对第一行进行字符串流可能看起来有些过分,但如果你的输入格式要求这样做:

k n
data1
data2
etc...

您想要检测何时发生这种情况:

k
n
data1
...

如果检测不重要,那么您可以直接从输入文件流中提取前两个值,并忽略剩余的剩余行以启动行追加循环。这样的代码看起来像这样:

#include <iostream>
#include <fstream>
#include <string>
#include <limits>
#include <cstdlib>

int main(int argc, char *argv[])
{
    if (argc < 2)
        return EXIT_FAILURE;

    std::ifstream inp(argv[1]);

    // read two integers
    int k, n;
    if (inp >> k >> n)
    {
        // ignore the remainder of the current line to position the first
        //  line for our seq append-loop
        inp.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

        std::string line;
        std::string seq;
        while (std::getline(inp, line))
            seq.append(line);

        // TODO: use k, n, and seq here
    }
    else
    {
        std::cerr << "Failed to parse k and/or n\n";
    }
}