💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
为了从文件获取数据,必须创建一个从文件到程序的流对象。这点我们可以利用ifstream的构造函数实现: ~~~ ifstream infile ("file-name"); ~~~ 该构造函数的参数是一个字符串,即你要打开的文件的名字。其结果是创建了infile对象,它支持所有 cin上可以执行的操作,包括>>和getline。 ~~~ int x; apstring line; infile >> x; // 读取一个整型数并保存到x中 getline (infile, line); // 读取整行并保存到line中 ~~~ 如果我们提前知道文件中有多少数据,那就可以直接写一个循环来读取整个文件,然后再停止。然而更常见的情况是,我们想读取整个文件,但是不知道其大小。 ifstream有几个用以检查输入流状态的成员函数,它们是good、eof、fail和bad等。我们使用good函数来确保文件成功打开,而使用eof函数来探测”文件尾“。 无论什么时候从输入流读取数据,直到检查时你才能知道尝试是否成功。如果eof函数的返回值为true,那说明已经到达文件尾,我们就知道最后一次读取尝试以失败告终。下面程序代码的功能是:读取一个文件的每一行并将其输出到屏幕上。 ~~~ apstring fileName = ...; ifstream infile (fileName.c_str()); if (infile.good() == false) { cout << "Unable to open the file named " << fileName; exit (1); } while (true) { getline (infile, line); if (infile.eof()) break; cout << line << endl; } ~~~ 函数c_str把apstring转换为原生C字符串。因为ifstream构造函数期望的参数是C字符串,所以apstring必须转换一下。 我们可以在打开文件之后,立即调用good函数。如果系统无法打开文件,该函数就返回false,原因很可能是文件不存在或者你没有文件读取权限。 while(true)是无穷循环的习惯写法。通常循环中某处会有个break语句,这样程序就不会真的永远运行下去(不过有的程序的确是希望永远执行)。这个例子中,break语句允许只要发现文件尾就退出循环。 退出循环操作放在输入语句和输出语句之间很重要,这样getline在遇到文件尾失败之后,我们就不会在line中输出无效信息。