【发布时间】:2021-12-30 22:47:06
【问题描述】:
我正在阅读我的一些旧代码,但我意识到我并不确切知道 ifstream 是如何工作的。以下代码应该只是读取一个文件,将其内容保存到一个对象中并创建另一个具有完全相同数据的文件,其写为:
#include <iostream>
#include <fstream>
using namespace std;
class grade {
public:
float grade1;
float grade2;
float grade3;
};
void read_file(grade data[]){
ifstream myfile("data.txt");
int i=0;
while(myfile >> data[i].grade1){
myfile >> data[i].grade2 >> data[i].grade3;
i=i+1; }
myfile.close();
myfile.clear();
}
void write_file(grade data[]){
ofstream myfile("data_out.txt");
for(int i=0; i<3; i++){
myfile << data[i].grade1 << "\t" << data[i].grade2 << "\t" << data[i].grade3 << endl;
}
myfile.close();
myfile.clear();
}
int main()
{
grade data[3];
read_file(data);
write_file(data);
return 0;
}
“data.txt”有:
23.5 10.1 11.6
14.3 8.2 9.3
6.5 6.7 5.3
代码工作得很好,但我不明白 ifstream 如何“知道”在给定时刻它应该在哪一行或哪一列,因为变量i 不用于控制myfile。我假设默认情况下 ifstream 有两个内部变量,一个用于行,另一个用于列,每次识别myfile >> xxx 命令时,列变量都会递增,并且每次循环重复时,行变量都会递增。
是这样的吗?实际上并没有控制代码在给定时刻的行或列,这让我很困惑。
比如说,在这个例子中,我只想读取第二行和第二列的数据。我可以使用像'myfile [1] [1] >> xxx'这样的显式表达式直接访问它吗?我猜getline可以用,但因为它用于字符串我真的不知道。
【问题讨论】:
-
我不明白 ifstream 如何“知道”在给定时刻它应该是哪一行或哪一列, ifstream 不知道真的知道。 ifstream 一旦碰到一些空格或输入流的结尾,就会停止读取数字。您的代码尝试读取一个数字并检查是否成功,它会尝试再读取 2 个数字,但不关心这两个数字的读取是否成功。读取 3 个数字后,它会递增
i并重复 -
std::ifstream不读取任何内容。它是一个数据源。>>运算符是您可以用来从 ani 流中读取数据的东西之一。 -
在
read_file和write_file函数中,无需显式关闭文件。析构函数就是这样做的。一旦文件被关闭,就没有理由打电话给clear()。
标签: c++ file readfile ifstream