您的位置:首页 > 编程语言 > C语言/C++

c++读取文件中字符,不过滤空白符

2017-08-02 18:53 405 查看
1)问题描述

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

[cpp] view
plain copy

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; 来强制读入每一个字符,不过滤空白符,包括换行符。

代码如下:

[cpp] view
plain copy

/* 

 * 从文件中读取字符,不忽略空白符 

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

[cpp] view
plain copy

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;  

}  

或者二次检查是否到文件结束

[cpp] view
plain copy

while(!infile.eof()){  

    infile>>c;  

    while( (c!=' ') && (c!='\t') && (c!='\n') && (!infile.eof())){  

        word[pos]=c;  

        pos++;  

    }  

    word[pos]='\0';  

    pos=0;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: