星竹 发表于 2010-4-24 19:12

判断文本文件的行数

C语言中怎么统计一个文本文件的行数啊?一定要剔除空行。而且文本文件保存的是矩阵。
有没有大虾可以帮忙啊?谢谢!

lq12131010 发表于 2010-5-22 16:43

WHILE(X=!NULL),.......................................

Rainyboy 发表于 2010-10-1 12:41

本帖最后由 wqsong 于 2010-10-25 13:15 编辑


#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;

#define BUFFERSIZE 255
int _tmain(int argc, _TCHAR* argv[])
{
      ifstream fDataFile;
      char pFileBuff;
      size_t nCount = 0;
      fDataFile.open("file.txt",ios::in);
      while (!fDataFile.eof())
      {
                fDataFile.getline(pFileBuff,BUFFERSIZE);
                size_t nCurrSizeOfLine = strlen(pFileBuff);
                for (size_t j=0;j < nCurrSizeOfLine;++j)
                {
                        if (pFileBuff==' ')
                        {
                              continue;
                        }
                        else
                        {
                              //遇到第一个非空格字符,认为是有意义的行
                              //如果本行确实是有意义的行,则该循环不会进行太多次
                              nCount++;
                              break;

                        }
                }
      }
      fDataFile.close();
      cout<<"Count of effective lines"<<nCount<<endl;
      system("pause");
      return 1;
}

wqsong 发表于 2010-10-25 13:13

本帖最后由 wqsong 于 2010-10-25 14:29 编辑

思路:
1、以行读取文件。
2、去掉行首行尾不可打印字符,如space,\v,\t等。
3、判断是否为空行。是统计数不变,不是统计数加1。
下面是C++写的一个字符串处理相关函数库(部分,全部见附件): //去除行首不可打印符
void trim_left_space(std::string &str)
{
      if(str.length() == 0)
                return;
      size_t beg = str.find_first_not_of(" \a\b\f\n\r\t\v");
      if(beg == std::string::npos)
      {
                str = "";
                return;
      }
      else
                str.erase(0, beg);
}

//去除行尾不可打印符
void trim_right_space(std::string &str)
{
      if(str.length() == 0)
                return;
      size_t end = str.find_last_not_of(" \a\b\f\n\r\t\v");
      if(end == std::string::npos)
      {
                str = "";
                return;
      }
      else
                str.erase(end + 1, str.length() - end - 1);
}

//去掉行首行尾不可打印字符
void trim(std::string &str)
{
      if(str.length() == 0)
                return;
      size_t beg = str.find_first_not_of(" \a\b\f\n\r\t\v");
      if(beg == std::string::npos)
      {
                str = "";
                return;
      }
      else
                str.erase(0, beg);
      size_t end = str.find_last_not_of(" \a\b\f\n\r\t\v");
      str.erase(end + 1, str.length() - end - 1);
}声明和实现没有分开,使用时候可以把声明和实现分开,已达到最小编译目的。

wqsong 发表于 2010-10-25 13:18

本帖最后由 wqsong 于 2010-10-25 13:19 编辑

文本处理不是C/C++强项,没有太多相关类库支持,可以平时写一些自己的库。如非必须不建议用C/C++。
相反,Perl、Python处理文本是强项,有丰富的类库支持。
看Python代码:# --coding:GB2312--
cnt = 0 #统计数初始化
fp = open('data.txt') #打开要查询的文件
for line in fp: #从fp中读取行,利用这种方法可以避免有空行截断读取
        line = line.strip()#去掉前后导空白
        if('' == line):
                continue #去掉前后导空白如果是空行不作处理
        cnt += 1
        # 其他操作
fp.close() #读完文件,关闭文件
print cnt

wqsong 发表于 2010-10-25 13:20

点编辑点错了,不小心编辑了Rainyboy的帖子,sorry。。。

Rainyboy 发表于 2010-10-25 15:07

其实判断文件行数啊,合并文件啊之类的属于那种平时不是很在意,但是要用的时候又不是很想的起来的部分……呵呵,楼主可以整理一个诸如“计算文件行数的18种方法”之类的存着,要用的时候打开看一看。
页: [1]
查看完整版本: 判断文本文件的行数