我有一个包含以下数据的文本文件。
第一行是这样的:
5 4 3 2 1
第二行是这样的:
1 2 3 4 5
我试图一次从一行读取数据,因为我的第一个链表对象将使用第一行的数据,而我的第二个链表对象将使用第二行的数据。我所能想到的最好的函数是:
void polynomial::allocate_poly(std::ifstream& in, const char* file, const char* number)
{
in.open(file);
std::string str;
char b;
int m = 0;
for(int i = 0; !in.eof(); ++i)
{
in >> b;
m = b - '0';
a.insert(m);
}这种方法有一些问题。我在for循环中尝试了不同的二元运算符,比如b == '\n',当b是换行符时,它们似乎都不会触发。
同样,以这种方式分配文件中的数字,它看起来像5 5 4 3 2 1 1 2 3 4 5,所以它似乎是在复制额外的5位,我不确定这是不是eof位。
我也尝试过使用getline函数,但由于某种原因,它似乎只复制了第一个整数,然后转储了文件的其余部分。我知道我肯定没有正确使用它,但我能找到的所有示例都是用于键入文件名,比如cin.getline,我希望在运行程序时能够将我的文件名作为命令行参数进行传递。
我的问题是,如何将第一行上的数字分配到换行符,然后将ifstream in变量传递给另一个对象以分配第二行?谢谢你的帮助。
发布于 2011-10-10 07:05:30
您没有说a是什么,但没关系:如果您想要基于行的解析,就需要在外部循环中使用getline。另外,永远不要使用eof,因为它不会做你想要的事情。而是使用到bool的隐式转换来检查操作是否成功。
下面是典型的演唱会:
#include <sstream>
#include <fstream>
#include <string>
std::string line;
std::ifstream infile("myfile.txt");
while (std::getline(infile, line)) // this does the checking!
{
std::istringstream iss(line);
char c;
while (iss >> c)
{
int value = c - '0';
// process value
}
}但是,这种从char到int的转换既麻烦又脆弱。为什么不直接读取一个整数呢?
int value;
while (iss >> value) { /* ... */ }编辑:根据您的评论,下面是读取两行代码的代码:
std::string line;
int val;
if (std::getline(infile, line))
{
std::istringstream iss(line);
while (iss >> value) { /* process first line */ }
}
if (std::getline(infile, line))
{
std::istringstream iss(line);
while (iss >> value) { /* process second line */ }
}https://stackoverflow.com/questions/7707143
复制相似问题