文件的内容格式如下
3 3 ABCD ABCD ABCD ...
我想读变量k中的第一个数字,另一个变量中的另一个数字说n。我希望存储在字符串中的其余行说seq以便
k = 3
n = 3
seq = ABCDABCDABCD..
我需要在c ++中这样做。我刚开始学习c ++。我知道如何逐行逐字阅读文件,但我不知道如何以这种特定格式读取文件。
答案 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";
}
}