解决直接用流的 >> 方法会自动把空白符作为输入的分界符的问题
2015-05-14 16:32
288 查看
1)问题描述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’;
}
比如有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情况
while(!infile.eof()){
infile>>c;
while( (c!=) && (c!=) && (c!=
word[pos]=c;
pos++;
( (infile>>c)==0){
break
word[pos]=
pos=0;
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;
}
或者二次检查是否到文件结束
1. while(!infile.eof()){
2. infile>>c;
3. while( (c!=) && (c!=) && (c!=) && (!infile.eof())){
4. word[pos]=c;
5. pos++;
6. word[pos]=
7. pos=0;
while(!infile.eof()){
infile>>c;
while( (c!=’ ‘) && (c!=’\t’) && (c!=’\n’) && (!infile.eof())){
word[pos]=c;
pos++;
}
word[pos]=’\0’;
pos=0;
}
1. ifstream infile("xxx.txt",ios::in); 2. while(!infile.eof()){ 3. infile>>c; 4. while( (c!=) && (c!=) && (c!= 5. word[pos]=c; 6. pos++; 7. infile>>c; 8. word[pos]= 9. (pos!=0){ 10. cout<<word<<endl; 11. pos=0;
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; 来强制读入每一个字符,不过滤空白符,包括换行符。
代码如下:
1. * 从文件中读取字符,不忽略空白符
2. * cc 20120904
3. #include <iostream>
4. #include <fstream>
5. usingnamespace
6. main(){
7. ifstream infile("d:\\f2.txt",ios::in); //以输入方式打开文件
8. //判断是否打开成功
9. (!infile) {
10. cerr<<"open error!"<<endl;
11. exit(1);
12. word[50];
13. //从文件逐个读取字符存放到c中,最终放到word数组中
14. pos=0;
15. //不忽略空白符,也不忽略每行最后那个'\n'
16. infile>>noskipws;
17. while(!infile.eof()){
18. infile>>c;
19. while( (c!=) && (c!=) && (c!=
20. word[pos]=c;
21. pos++;
22. infile>>c;
23. word[pos]=
24. (pos!=0){
25. cout<<word<<endl;
26. pos=0;
27. infile.close();
28. return
29. /*
30. * 从文件中读取字符,不忽略空白符
31. * /
32. #include <iostream>
33. #include <fstream>
34. using namespace std;
35. int main()
36. {
37. ifstream infile("d:\\f2.txt",ios::in); /*以输入方式打开文件*/
38. /*判断是否打开成功*/
39. if(!infile) {
40. cerr<<"open error!"<<endl;
41. exit(1);
42. }
43. char c;
44. int pos;
45. char word[50];
46. //从文件逐个读取字符存放到c中,最终放到word数组中
47. pos=0;
48. //不忽略空白符,也不忽略每行最后那个'\n'
49. infile>>noskipvs;
50. while(!infile.eof()){
51. infile>>c;
52. while((c!=' ') && (c!='\t') && (c!='\n') ){
53. word[pos]=c;
54. pos++;
55. infile>>c;
56. }
57. word[pos]='\0';
58. 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!=) && (c!=
word[pos]=c;
pos++;
( (infile>>c)==0){
break
word[pos]=
pos=0;
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;
}
或者二次检查是否到文件结束
1. while(!infile.eof()){
2. infile>>c;
3. while( (c!=) && (c!=) && (c!=) && (!infile.eof())){
4. word[pos]=c;
5. pos++;
6. word[pos]=
7. pos=0;
while(!infile.eof()){
infile>>c;
while( (c!=’ ‘) && (c!=’\t’) && (c!=’\n’) && (!infile.eof())){
word[pos]=c;
pos++;
}
word[pos]=’\0’;
pos=0;
}
相关文章推荐
- 关于开发在线网页编辑器按回车会输入<p>而不是<br>的解决方法
- 1&amp;gt;s.cpp(465) : error C2448: “main”: 函数样式初始值设定项类似函数定义 问题的解决方法
- VC 中 file->open 打不开文件问题解决方法
- VM8.0下安装遇到了问题“windows cannot read the<product key> setting from the unattend answer file”解决方法
- asp.net中,在客户端,加入<%=....%>代码时出现的问题解决方法
- WAS profile 通过manageprofiles.bat 创建不能作为主机服务项自动随开机启动问题解决方法
- Winform中DataGridView绑定List<T>数据源时,点击DataGridView列头不能自动排序解决方法
- 问题描述: 安装&重启完成后,我输入命令xm list,提示错误 xm list Can't find hypervisor information in sysfs 解决方法: # mv /
- 关于html中charset与<title>位置不同页面空白的问题及解决方法
- Qt4项目迁移Qt5项目一问题解决方法:#include <QtGui/QApplication> ---> No such file or directory
- Android SDK Manager更新<dl-ssl.google.com> != <www.google.com> 问题解决方法
- 框架<frame>登录超时自动统一页面弹出解决方法
- Android listview&gridview getview 方法多次调用问题解决方法--->导致gridview错位
- Don't know how to iterate over supplied "items" in &lt;forEach&gt;问题的解决方法
- 使用<a>标签提交action会执行两次后台方法的原因(反射机制小实例问题的解决)
- #import </usr/include/objc/objc-class.h> not such file or directory问题的解决方法
- 关于八数码问题中的状态判重的三种解决方法(编码、hash、<set>)
- Yii的CDbCriteria查询(以及使用$criteria->join出现问题的解决方法)
- C#中泛型集合List<T>反序列化问题及解决方法
- 使用vim编写c++对于输入输出流<<和<>括号匹配冲突的解决方法