一、文件输入流
ifstream ifs("explicit.cc");
if(! ifs.good()){
cerr << "ifs open file fail !" << endl;
return;
}
1、按行读取
string line;
while(getline(ifs,line)){
cout << line << endl;
}
2、读取一个文件的全部内容
tellg用来获取游标位置,seekg用来设置游标位置。
string filename= "explicit.cc";
ifstream ifs(filename);
if(!ifs){
cerr <<"ifs open file fail !";
return;
}
//读取一个文件的所有内容,先要获取文件的大小,将游标放到了文件的最后。
ifs.seekg(0,std::ios::end);
long length = ifs.tellg();
cout << length << endl;
char * pdata = new char[[length + 1]();
//需要将游标再放置到文件开头
ifs.seekg(0,std::ios::beg);
ifs.read(pdata,length);
3、读取一个文件的所有内容,每次读取20个字节
#include <fstream>
#include <iostream>
int main()
{
std::ifstream file("filename.txt", std::ios::binary);
if (!file)
{
std::cerr << "无法打开文件" << std::endl;
return 1;
}
char buffer[20]; // 用于存储每次读取的20个字节
while (file.read(buffer, sizeof(buffer)))
{
for (size_t i = 0; i < file.gcount(); ++i)
{
std::cout << buffer[i];
}
}
// 检查是否还有未处理的字符(由于最后一次读取可能不足20个字节)
if (file.gcount() > 0) {
// 输出剩余的部分
for (size_t i = 0; i < file.gcount(); ++i) {
std::cout << buffer[i];
}
}// 检查文件是否因为到达末尾而退出循环,或者因为其它原因(如错误)
if (file.eof())
{
std::cout << "到达文件末尾" << std::endl;
}
else if (file.fail())
{
std::cerr << "读取文件时发生错误" << std::endl;
}
file.close(); // 关闭文件,但在c++中,当ifstream对象销毁时会自动关闭。所以这里file.close();不是必须的。
return 0;
}
gcount()
用于返回最近一次未格式化的输入操作(如read()
,get()
,getline()
,ignore()
等)中提取的字符数。在C++的
std::ifstream
中,read
函数并不要求每次必须读取固定数量的字节。read
函数的第二个参数是一个std::streamsize
类型的值,它指定了最多要读取的字节数。
如果文件中有足够的字节可以读取,
read
函数会尝试读取指定数量的字节。- 如果文件中剩余的字节少于指定的数量,
read
函数会读取所有剩余的字节,并设置流的状态标志eofbit
来表示已经到达文件末尾。- 如果在读取过程中发生错误(如磁盘错误),
read
函数会设置流的状态标志failbit
或badbit
。3、如果文件
filename.txt
的大小不是buffer
(即20个字节)的整数倍,那么在最后一次循环时,file.read(buffer, sizeof(buffer))
只会读取剩余的部分(少于20个字节),但是您的输出循环仍然会尝试输出整个buffer
的内容,导致最后一次可能会输出乱序字符。
额外补充:
一、void perror(const char *str); 如perror("Error opening file"); // 使用 perror 打印错误描述 。当你调用 perror(msg)
,它将执行以下操作:
- 首先,它将尝试打印出你提供的字符串
msg
(如果有的话)。 - 然后,它会在
msg
后面添加一个冒号(:
)和一个空格。 - 接着,它会打印出与当前
errno
值对应的错误描述。
errno
是一个全局变量,用于存储最近一次系统调用或库函数调用的错误代码。当系统调用或库函数调用失败时,通常会设置 errno
来表示发生了什么错误。perror()是C语言专属的。在c++中,可以使用异常处理机制(try/catch块)来处理错误。
二、exit(1);
是一个库函数调用,用于立即终止程序的执行。