缘起:
这是一个朋友让帮忙写的,其实程序本身很简单,但是要求完全用C++ 风格来实现,尽量不要看到C 的影子,OK,那就试试看咯。
题目:
写一个程序,读取一个利用命令行指定的文本文件,输出文件内容到显示器,并且给每一行输出添加一个行号
环境:
Windows XP Professional sp3 下面用 GNU GCC 的编译器编译。
采用这个编译器因为它是开源的,很容易下载到,而且Linux 上也可以用,还有一个比较关键的,它支持标准C++。推荐使用!*^_^*
实验步骤:
1,新建一个文本文件,命名 "add_line_number.cpp"。
2,添加如下代码到文件中:
#include < fstream >
#include < string >
using namespace std;
int main( int argc, char ** argv)
{
if (argc != 2 )
{
cout << " Please use command like: my_print add_line_number.cpp " << endl;
return 1 ;
}
fstream fFile(argv[ 1 ], ios:: in | ios:: out ); // 事实上,后面的打开模式可以不写,这是fstream 打开文件的默认方式
if ( ! fFile.is_open())
{
cout << " Open file error! Application will exit. " << endl;
return 2 ;
}
string strTextLine;
string ::size_type i = 1 ;
while (getline(fFile, strTextLine, ' \n ' ))
{
if (i < 10 )
{
cout << " " << i ++ << " .| " << strTextLine << endl;
}
else
{
cout << i ++ << " .| " << strTextLine << endl;
}
}
fFile.close();
return 0 ;
}
3,编译 "add_line_number.cpp" 。
4,OK,应该会在与 "add_line_number.cpp" 相同文件夹下生成 main.exe 文件。
打开命令行提示符窗口 ( 开始 -> 运行 -> cmd ) ,接着输入 main add_line_number.cpp ,输出我们这个小程序的源代码。没问题的话,应该可以看到最终的效果了。
讨论:
小程序到此就结束了,程序很简单,不多解释了,我会慢慢添加关于 C++ 标准库的小练习,穿插着就可以把一些需要熟悉的类或者容器的基本用法给弄明白了。
好了,回来这个小程序。是否还有其他的方法来高效读取文件呢?对于大体积的文件,又如何呢?
程序尽管简单,但是需要讨论的问题不少,比如:
1. 如果是一个电话号码的记事本,格式形如:
张三, 13955665566
李四, 15812345678
王二, 13612344321
……
其中,姓名可能是重复的,但是电话号码是唯一的,还有可能由于记录人的疏忽,记录了一条重复的记录。那如何去重,并排序后输出呢?
2. 这里没有对文件进行异常处理,应该加上,尽管是小练习。这里,我投机一把,嘿嘿,直接让他退出了。
3. 正在想 …… -_-
总结:
本程序就完全用 C++ 的方式来实现题目的要求了,看不到C 的影子,其实,也就是用C++ 标准库里面的 string 去代替了 C 中可能会用的 char * 以及字符数组。