我想从一个结构非常奇怪的文件中读取数据。该文件如下所示:
some lines with text....
10 1000 10
1 1 1
1 100 100
.
.
.
some lines with text...
again data like above..
some lines with text... etc
所以我有两个问题:
如何只读取包含数据的特定行?
如何阅读这些正确对齐的数据?
以下是我的一项试验:
string line;
ifstream myfile ("aa.txt");
double a,b,c;
while (! myfile.eof() )
{
for (int lineno = 0; getline (myfile,line); lineno++)
if (lineno>2 && lineno<5){
myfile>>a>>b>>c;
cout<<lineno<<" " << line << endl;}
}
myfile.close();
答案 0 :(得分:0)
如何只读取包含数据的特定行?
好吧,读取所有行,然后编写一个函数来检测当前行是否为“数据”。
您的数据线有哪些特点?它只包含数字和空格?可以有标签吗?那些柱子,它们的宽度是固定的吗?您的谓词函数可以检查所需列中是否有空格。
如何阅读这些正确对齐的数据?
你想提取整数值?好吧,你可以为你的行创建一个std::istringstream
(一旦你检查了是数据),然后使用>>
流提取运算符将值读入变量适当的类型。
了解它如何处理空白(和/或实验) - 它可能会毫不费力地完成你需要的工作。
答案 1 :(得分:0)
这只是一个简单的例子:你声明了3个变量,你做了a,b,c作为整数和一个字符串行你打开一个文件和输入行将行转换为整数如果确定将它分配给一个如果不是不对b和c做任何事情直到下一次读取,直到a的有效转换为ok,然后输入b和c,如下所示:
#include <iostream>
#include <string>
#include <fstream>
int main()
{
std::ifstream in("data.txt");
int a = 0, b = 0, c = 0;
std::string sLine;
if(in.is_open())
{
while(in >> sLine)
{
if( a = atoi(sLine.c_str()))
std::cout << "a: " << a << std::endl;
if(a)
{
in >> sLine;
if( b = atoi(sLine.c_str()))
std::cout << "b: " << b << std::endl;
}
if(b)
{
in >> sLine;
if( c = atoi(sLine.c_str()))
std::cout << "c: " << c << std::endl;
}
}
}
in.close();
std::cout << std::endl;
return 0;
}