c++读取文件中字符,不过滤空白符
2012-09-04 22:14
1201 查看
1)问题描述
C++读取一个文本文件时,直接用流的 >> 方法会自动把空白符作为输入的分界符,所以如下代码存在问题
比如有test.txt文件
my name is zhccl
当用 infile>>c 读到 "my" 的 “y” 之后,下一个会自动滤过 空格符 因为空格符是作为一个标准输入的非有效字符,下一次会读入 ”n“ 所以整段代码会读入word=”mynameiszhccl“
并不会分别读到 my,name,is,zhccl
2)解决方案
1.用 infile.getline(),来解决,一次读到一个 "\n" 为止,再来用空白符作为分界符来解释 word[]
2.用 infile>>noskipws; 来强制读入每一个字符,不过滤空白符,包括换行符。
代码如下:
这儿有点问题,就是文件最后必须是一个 ”\n“ ,否则程序会崩溃,我正在纳闷这一点。
持续更新:
找到原因了,在文件 test.txt
my name is zhccl
当准备读 ”zhccl“ 时,此时while(!infile.eof())判断通过,然后会一直读,infile>>c 知道已经读到文件结尾了,此时infile=0,我们并没有去验证inflie是否到末尾,所以c的值保持前一次读入字符 ”l“ ,并不从文件读入字符来更新,即最后一个读入的字符串为”zhccllllllllllll.....“ 直到 word[] 溢出,出错。
改正方法:
检查infile情况
或者二次检查是否到文件结束
C++读取一个文本文件时,直接用流的 >> 方法会自动把空白符作为输入的分界符,所以如下代码存在问题
ifstream infile("xxx.txt",ios::in); while(!infile.eof()){ infile>>c; while( (c!=' ') && (c!='\t') && (c!='\n') ){ word[pos]=c; pos++; infile>>c; } word[pos]='\0'; if(pos!=0){ cout<<word<<endl; } pos=0; }
比如有test.txt文件
my name is zhccl
当用 infile>>c 读到 "my" 的 “y” 之后,下一个会自动滤过 空格符 因为空格符是作为一个标准输入的非有效字符,下一次会读入 ”n“ 所以整段代码会读入word=”mynameiszhccl“
并不会分别读到 my,name,is,zhccl
2)解决方案
1.用 infile.getline(),来解决,一次读到一个 "\n" 为止,再来用空白符作为分界符来解释 word[]
2.用 infile>>noskipws; 来强制读入每一个字符,不过滤空白符,包括换行符。
代码如下:
/* * 从文件中读取字符,不忽略空白符 * cc 20120904 */ #include <iostream> #include <fstream> using namespace std; int main(){ ifstream infile("d:\\f2.txt",ios::in); //以输入方式打开文件 //判断是否打开成功 if(!infile) { cerr<<"open error!"<<endl; exit(1); } char c; int pos; char word[50]; //从文件逐个读取字符存放到c中,最终放到word数组中 pos=0; //不忽略空白符,也不忽略每行最后那个'\n' infile>>noskipws; while(!infile.eof()){ infile>>c; while( (c!=' ') && (c!='\t') && (c!='\n') ){ word[pos]=c; pos++; infile>>c; } word[pos]='\0'; if(pos!=0){ cout<<word<<endl; } pos=0; } infile.close(); return 0; }
这儿有点问题,就是文件最后必须是一个 ”\n“ ,否则程序会崩溃,我正在纳闷这一点。
持续更新:
找到原因了,在文件 test.txt
my name is zhccl
当准备读 ”zhccl“ 时,此时while(!infile.eof())判断通过,然后会一直读,infile>>c 知道已经读到文件结尾了,此时infile=0,我们并没有去验证inflie是否到末尾,所以c的值保持前一次读入字符 ”l“ ,并不从文件读入字符来更新,即最后一个读入的字符串为”zhccllllllllllll.....“ 直到 word[] 溢出,出错。
改正方法:
检查infile情况
while(!infile.eof()){ infile>>c; while( (c!=' ') && (c!='\t') && (c!='\n') ){ word[pos]=c; pos++; if( (infile>>c)==0){ break; } } word[pos]='\0'; pos=0; }
或者二次检查是否到文件结束
while(!infile.eof()){ infile>>c; while( (c!=' ') && (c!='\t') && (c!='\n') && (!infile.eof())){ word[pos]=c; pos++; } word[pos]='\0'; pos=0; }
相关文章推荐
- c++读取文件中字符,不过滤空白符
- C++实现文件简单加密与解密(读取文件中的字符,对字符转换,然后写入,完成加密,解密反之)
- C++ 读取文件并统计字符数、行数和单词数
- C++文件读写操作(一) 逐字符读取文件
- java-读取文件,过滤敏感字符后生成新文件
- Unicode(UTF16)文件读写终极方案---用C++标准的字节流读取,转化为宽字符(wchar_t),再以字节流写入
- c++读取文件内容并统计指定字符的个数
- 文件读取C++文件读写操作(二)逐字符读取文本和逐行读取文本
- C++文件读取与字符分割
- 如何用c++ 依次读取文件 到指定字符
- C++文件顺序读取,最后一个字符被读取两遍的原因
- Unicode(UTF16)文件读写终极方案---用C++标准的字节流读取,转化为宽字符(wchar_t),再以字节流写入
- C++文件读写操作(二)逐字符读取文本和逐行读取文本
- 关于从txt文件读取字符,怎么过滤空格,回车,换行符等。
- C++ 读取文件字符,统计字符频率
- Unicode(UTF16)文件读写终极方案---用C++标准的字节流读取,转化为宽字符(wchar_t),再以字节流写入
- C++ 使用ifstream和getline读取文件内容
- C++中Txt文件读取和写入
- fopen&nbsp;读取文件&nbsp;C++&nbsp;cocos2dx
- 使用ifstream的get()函数读取文件中的字符后输出时,最后一个字符多输出一次