getline的获取ifstream的数据
来源:互联网 发布:csi网络犯罪调查第一季 编辑:程序博客网 时间:2024/05/07 21:48
最近要使用ifstream的getline函数来获取文件的每一行数据,但就搞不懂怎样才能确保获取数据时所使用的缓冲区大小足够大。在刚开始的时候,我是采用了以下的手段:
代码
#include <iostream>
#include <fstream>
using namespace std;
#define BASE_BUFF_MAX_LEN 10
int main()
{
char *filePath = "E:\\test.txt";
int bufLen = BASE_BUFF_MAX_LEN;
char *buf = new char[bufLen];
ifstream fin;
fin.open(filePath,ios::in);
fin.getline(buf,bufLen);
while(fin.fail())
{
fin.getline(buf,bufLen);
}
cout<<buf<<endl;
}
当缓冲区不够大的时候,getline函数也会对缓冲区输入数据,但同时也会把ifstream的状态位failbit设置了,于是fail函数会返回true。于是上述代码会嵌入死循环,由于处于fail状态下的ifstream,其getline函数不会再读入任何数据,因此后续的getline调用没有效果,并且fail函数一直返回true。
看看文档,原来可以使用ifstream的clear函数重置状态位,于是以下方法就能达到目的:
代码
#include <iostream>
#include <fstream>
using namespace std;
#define BASE_BUFF_MAX_LEN 10
int main()
{
char *filePath = "E:\\test.txt";
int bufLen = BASE_BUFF_MAX_LEN;
char *buf = new char[bufLen];
ifstream fin;
fin.open(filePath,ios::in);
fin.getline(buf,bufLen);
while(fin.fail())
{
fin.clear(ios::goodbit);
fin.getline(buf,bufLen);
}
cout<<buf<<endl;
}
同时,ifstream的gcount函数会返回上一次读取操作中,读入的有效字符数,但就不保存缓冲区中最后的'\0',因此如果缓冲区大小为10,gcount将输出9。上述方法其实也比较别扭,更好的方法是使用<string>头文件定义的getline:
代码
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
#define BASE_BUFF_MAX_LEN 10
int main()
{
char *filePath = "E:\\test.txt";
ifstream fin;
fin.open(filePath,ios::in);
string s;
getline(fin,s);
cout<<s<<endl;
}
简单直接。
0 0
- getline的获取ifstream的数据
- ifstream.getline()的陷阱
- “ifstream类的getline函数”和“getline函数”的区别
- ofstream ifstream getline 对文件的操作 !
- getline和ifstream<<读文件的方式
- 运用ifstream的getline时需要注意的问题
- 原创:运用ifstream的getline时需要注意的问题
- 运用ifstream的getline时需要注意的问题
- 使用ifstream读取文件的数据不完整的问题
- ifstream 和 getline 读取文件
- 读取文件:ifstream和getline
- ifstream 文件流读取格式数据出现的问题
- ifstream的用法(Breaf)
- 由ifstream想到的
- ifstream、ofstream的使用
- ifstream的使用问题
- ifstream,ofstream的使用方法
- ifstream 的使用方法介绍
- 1 gradle 介绍 安装
- PHP中的数组函数
- Delphi之websocket及socket.io开源组件
- 第14周项目1-(1)验证折半查找算法
- Android 定时循环任务实现
- getline的获取ifstream的数据
- mybatis 接口形式访问
- 51NOD 1640 天气晴朗的魔法(二分+最大生成树)
- C++函数模板 模板实例化、具体化
- EEA算法
- Java反射机制学习笔记
- Zapcc:一个更快的C++编译器
- C++中新的关键字
- 排序(二)非比较排序