解决直接用流的 >> 方法会自动把空白符作为输入的分界符的问题

1)问题描述C++读取一个文本文件时,直接用流的 >> 方法会自动把空白符作为输入的分界符,所以如下代码存在问题

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情况

  1. while(!infile.eof()){
    1. infile>>c;
    2. while( (c!=) && (c!=) && (c!=
    3. word[pos]=c;
    4. pos++;
    5. ( (infile>>c)==0){
    6. break
    7. word[pos]=
    8. 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值