从文件计数行不使用getline()

时间:2018-01-01 03:22:28

标签: c++

我想从文件中获取一些数据并将其放入变量中。但之前,我不知道这个文件的长度。文件看起来像:

 1 12 4
 2 14 5
 3 26 6
 . .. .

这就是为什么我想要了解一些行,我需要在循环中创建多少变量。在这段代码中,我创建了3个变量(a,b,c)来尝试。问题是在程序结束后a,b,c只是随机数而不是1,12和4。 我注意到,如果我这样说:

  

file>> a>> b>> ℃;

在while循环之前

它可以工作,但我需要更早的行数。 那么如何计算不使用getline()的行?

int a, b, c;
fstream file;
file.open("abc.txt",ios::in);

if (file.good() == true)
{
    int lines_amount=0;
    string test; 



    while (getline(file,test))
    {
        lines_amount++;
    }
    file >> a >> b >> c;

    file.close();
}

3 个答案:

答案 0 :(得分:2)

倒带文件指示器怎么样?

file.seekg(std::ifstream::beg);

在之前的while循环中,整个文件已被阅读,因此下一次阅读没有任何内容,ab和{{1保持不变。在此代码之后,文件指示符将重置为文件的开头,因此您可以重新开始阅读。

在调用c之前,您可能需要添加file.clear()以清除已设置的任何标志,以防止进一步的操作失败。如果设置了坏旗,他们中的大多数都不会做任何事情。在您的情况下,当尝试阅读更多内容时,seekg()函数会找到错误标记(operator >> ())并停止。 Further Reference

答案 1 :(得分:2)

使用时

import { clearInterval } from 'timers'; 

while (getline(file,test)) { lines_amount++; } 循环仅在读取文件中的所有内容后停止。这条线

while

不会将任何内容读入file >> a >> b >> c; ab。这些变量的值是您获得的一些随机值,因为它们之前尚未初始化。

将它们初始化为:

c

你会注意到:

  1. 如果使用pre-C ++ 11编译器,则这些变量的值保持不变。
  2. 如果使用C ++ 11或更高版本的编译器,则这些变量的值将设置为0.
  3. 为了能够从文件的开头读取数字,请将其倒回到顶部。您可以使用int a = 10, b = 20, c = 30; 。您必须首先清除其std::ifstream::seekg

    eofbit

答案 2 :(得分:0)

  

这就是为什么我想知道多少行,我需要在循环中创建多少变量。

您不需要事先了解行数。使用std::vector存储值,并在向其中添加值时动态增长。例如:

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

struct values {
    int a, b, c;
};

std::vector<values> data;
std::ifstream file("abc.txt");
if (file.is_open()) {
    std::string line;
    while (std::getline(file, line)) {
        std::istringstream iss(line);
        values v;
        if (iss >> v.a >> v.b >> v.c) {
            data.push_back(v);
        }
    }
    file.close();
    // use data as needed...
}

可替换地:

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>

struct values {
    int a, b, c;
};

std::istream& operator>>(std::istream &in, values &v) {
    std::string line;
    if (std::getline(in, line)) {
        std::istringstream iss(line);
        if (!(iss >> v.a >> v.b >> v.c)) {
            in.setstate(std::ios_base::failbit);
        }
    }
    return in;
}

std::vector<values> data;
ifstream file("abc.txt");
if (file.is_open()) {
    std::copy(
        std::istream_iterator<values>(file),
        std::istream_iterator<values>(),
        std::back_inserter(data));
    file.close();
    // use data as needed...
}