如何从文件 c++ 中读取数据

How to read data from file c++

提问人:David Li 提问时间:1/19/2016 最后编辑:ZieziDavid Li 更新时间:1/19/2016 访问量:1668

问:

我有一个文件组织如下:data.txt


nodeNum 10 NodeId 坐标 0 0 0 1 1 1 2 2

2 3 3 3 4 4
4 5 5
5 6 6 6
6 7 7
7 8 8
8 9 9 9 边(从 i 到 j) 权重

0 1 1.5 1 1 2.1 2 1 3.3 3 1 4.0

4 1
5.0
5 1 6.6
6 1 3.7
7 1 8.1
8 1
9.3
9


1

10.2


如何读取和存储数据,如下所示:

int nodeNumber; // <--------- get and store number in line number 2 in text file.

std::vector<Node> nodes(nodeNumber);   
double x1, y1;

for (int i=0; i< nodeNumber; i++) {
    nodes.at(i) = g.addNode();
    x1 , y1 //<-- x1 and y1 store coordinate from line 4 to line 4 + nodeNum, respectively 
    coord[nodes.at(i)].x=x1;
    coord[nodes.at(i)].y=y1;
} 

从线路:

边(从 i 到 j) 权重 //(行号 3+nodeNum (=3+10) ) 到最后。
i <-- 第一个数字,j <-- 第二个数字,z[i,j] < ---第三个数字。

我不知道这样做。谁能帮我?

C++ 文件-IO IOstream fstream

评论

1赞 Thomas Matthews 1/19/2016
可能的重复项,“stackoverflow c++ read from file”
0赞 Thomas Matthews 1/19/2016
问题是问题的核心是重复的,但整个问题与这里发布的关于从文件中读取整数的其他问题略有不同。
2赞 NathanOliver 1/19/2016
@dsz 为什么要建议,当我们在C++有流时?fopenscanf
0赞 dsz 1/19/2016
好的,我得到了fopen和scanf是老式的,我刚刚意识到标签正在寻找流解决方案。应该坚持我的最后一点。
0赞 πάντα ῥεῖ 1/19/2016
@dsz “我明白了 fopen 和 scanf 是老派的,......” 不,它们不是老派的,它们从来都不是 c++ 学校的一部分。

答:

1赞 Thomas Matthews 1/19/2016 #1

我建议使用 or 来表示文件中的一行数据。接下来是重载以读取数据(并选择性地删除换行符)。classstructoperator>>

struct Coordinate
{
  int x, y, z;
  friend istream& operator>>(istream& input, Coordinate& c);
};

istream& operator>>(istream& input, Coordinate& c)
{
  input >> x >> y >> z;
  return input;
}

坐标向量的输入循环变为:

std::vector<Coordinate> points;
Coordinate c;
while (data_file >> c)
{
  points.push_back(c);
}

读取非坐标时,输入将失败。此时,清除流状态并读取边缘记录。

评论

0赞 Ziezi 1/19/2016
是否可以修改为逐行读取文件并仅提取数值?
1赞 Thomas Matthews 1/19/2016
是的。抬头看一下。因此,您将使用 .C++ 这种方式很好,因为它是派生自 ,不需要对类进行任何更改。std::getlinestd::istringstreamdata_filestd::istringstreamistringstreamistreamCoordinate
0赞 David Li 1/19/2016
但这只能帮助处理一条单独的路径。如何跳过第 1、3、14 行。如何读取第 2 行并存储在 int nodeNumber 和 STOP,然后声明大小为 nodeNumber 的向量?
0赞 David Li 1/19/2016
我的问题是我不知道如何读取第 2 行将此数字存储到 int nodeNumber,然后停止。然后声明一个之前已经读取过的大小为 nodeNumber 的向量,并继续读取从第 4 行到第 14 行的数字,存储在 ID、x[ID]、y[ID] 中。从第 16 行到最后一行:读 i<- 第一个数字,j < - 第二个数字,z[i][j] 最后一个数字。我经常在互联网上查找,但这无济于事,因为我不聪明。请帮帮我!