首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个异常的统计文本文件的空行的有关问题

2013-02-19 
一个错误的统计文本文件的空行的问题一个错误的统计函数的问题要求:统计某一个文本文件,有多少行?包括空行

一个错误的统计文本文件的空行的问题
一个错误的统计函数的问题

要求:统计某一个文本文件,有多少行?包括空行。

这个代码是我在一个非常老的帖子里找到的答案,是一个错误的,

原因不得而知。

我测试过当文本文件是这样的话,那么会有严重漏洞

空行1
hello
空行2
csdn

 预计结果是4,结果这代码统计出来的是3.


#include <iostream>
#include <fstream>
#include <string>

int main()
{
    using namespace std;
    const char filename[] = "test.cpp";
    ifstream fin;
    string temp;

    fin.open(filename);
    if (!fin.is_open())
    {
        cout << "不能打开文件"<< filename << endl;
        exit(EXIT_FAILURE);
    }
    int count = 0;
    getline(fin, temp);
    while (fin.good())
    {
        count++;
        getline(fin, temp);
    }
    fin.close();
    cout << "文件" << filename << "共有"
        << count << "行。\n";
    return 0;
}


猜测:geline是会对某些标志进行置位的, 如果某一非空行后跟一个空行,那么这个函数就会对标志置位,导致good()返回false.

但是:如果文本的第一行是空行,这个函数又不会返回false.    可见getline这个函数是多么的2啊。。。。。。。。。。



一个异常的统计文本文件的空行的有关问题


[解决办法]


         << count << "行。\n";
     return 0;
 }
while(infile.good())//while input good and not at EOf
读文件时有几点你需要检查,首先程序文件不应超过EOF,如果到达文件尾返回true;程序也可能遇到类型不匹配的时候,若有不匹配fail()返回true;也有可能遇到意外的情况如恶文件损坏或硬件故障。如果最后一次读取文件时发生了这样的问题bad()返回true,分别检查这种情况用good(),个就是说good()也检查是否到达文件尾
在读完第四行后已到达文件尾了,所以count少加了一次楼主,我感觉这样修改一下比较好,
#include <iostream>
 #include <fstream>
 #include <string>
 
int main()
 {
     using namespace std;
     const char filename[] = "t.txt";
     ifstream fin;
     string temp;
 
    fin.open(filename);
     if (!fin.is_open())
     {
         cout << "不能打开文件"<< filename << endl;
         exit(EXIT_FAILURE);
     }
     int count = 1;
      getline(fin, temp);
     while (fin.good())
     {
         
        getline(fin, temp);
                count++;
cout<<temp<<endl;
     }
     fin.close();
     cout << "文件" << filename << "共有"
         << count << "行。\n";
     return 0;
}
#include <iostream>
 #include <fstream>
 #include <string>
 
int main()
 {
     using namespace std;
     const char filename[] = "t.txt";
     ifstream fin;
     string temp;
 
    fin.open(filename);
     if (!fin.is_open())
     {
         cout << "不能打开文件"<< filename << endl;
         exit(EXIT_FAILURE);
     }
     int count = 0;
     
     while ( getline(fin, temp))
     {
         count++;
        
cout<<temp<<endl;
     }
     fin.close();
     cout << "文件" << filename << "共有"
         << count << "行。\n";
     return 0;
}
为什么这样可以呢,使用good()是现在循环前(首次执行循环测试前)防止一跳输入语句,并在循环的末尾(下次执行循环测试前)放置一条输入放语句
infile>>value;
while(infile.good())
{
infile>>value;
}
鉴于这种事实可对上述代码进行精简:表达式infile>>value的结果为infi了,而在需要一个bool值得情况下infile的结果为infile.good(),即true或false


因此可以让两条输入语句用一条用作循环测试的输入语句代替。即:
while(infile>>value)
{
}
这种设计仍然遵循了在测试之前读取得规则,因为要计算表式ifile>>value的值程序必须首先将一个数字读取到value中
同理因为infile>>value是一个一个读的而getline()是一行一行读的,getline也适用
不知你懂了吗,你可以看看C++Primer plus这本书,书上讲的挺细的呵呵



 


 



 
[解决办法]

引用:
问题3: ifstream.open函数 默认是in方式打开的。
 
可是有很多文章说, 如果不存在该文件,救护创建一个。
 
我做个验证,没有创建该文件。
 
很奇怪
in方式不会创建文件的,out才会

热点排行
Bad Request.