2017年11月初,随着工作岗位的调动,我转到了研发岗,开始了漫漫程序员的成长之路。首先介绍下个人知识储备,大一学习过C语言,没有工程经验,所学是为了期末考试+2级考试,考完在大学+硕士期间没有用到编程。
来到新的工作岗位,心情是既激动又忐忑的,作为一名青铜段位程序员,我得好好规划下学习、成长的路径。
我选择的方法是,跟着项目走,工作中不可能给你大把时光来造作,去把厚厚的C++ Primer or C++ Primer Plus给通读一遍。带着任务去学习,学的最快。具体而言,我的学习思路是:
1. 首先,找到一个网站的C++教程(要求必须精简),大致了解面向对象的思路、类、对象、构造、析构等等各种概念,心中有数即可,练习题都不用做,没时间啊。有大把时光的学生党当然还是老老实实地打好基础,按部就班跟教材走最好。
2. 上述1大概花2天时间搞定,此时可以开始动手了。这个时候推荐QT这个IDE,主要原因是颜值高、自带assistant、丰富的类库,带designer,哪怕你啥都不会,都可以很爽快地在设计界面加上lineEdit写上自己的大名,做出一个对话框,满满的成就感。如我这般初学者上手最好要看到程序输出结果,用成就感正反馈兴趣,才能带起自己的节奏啊。
3. 跟着网上一个QT的教程,用1-2天时间大致试一试各种功能,一定要将教程的代码自己敲到IDE中(不建议复制),在这过程中,你会加深对类、对象、指针的印象,有不懂的就问度娘,去找大神的博客学习。
4. 做工程,相比此时你手头肯定有工作任务,那就顺着任务一点一点往下啃吧。
比如,我的第一个工作任务,就是要读一个文本文件,再存到另一个文件中去。接到这个任务要怎么考虑呢?
首先,百度“C++如何读文本文件”,你会看到推荐用“fstream”的各种网页。让我们再搜一把“QT如何读文本文件”,你会看到推荐用“QFile和QTextStream”的各种网页。对新手来说,肯定选后者啊,先易后难,就跟考试做题一样,自带assistant和丰富的example的QT是很好的选择,值得拥有。
其次,就开始看这两个类,推荐先别看assistant,因为里面太详细了,又有语言关要过,直接先百度找例子,看看大神们写的最简单的例子,马上就可以用了,自己建一个工程,建一个.txt文件,写上几行,马上就能见到效果。
再次,等各种求助、磕磕绊绊把任务给搞定后,别忘了最重要的一步——总结,把你借鉴的知识点变成自己的。什么样算变成自己的呢?个人认为有一个标准:在不查各种资料的情况下,能轻易写出代码,并给一个如我这般的萌新讲清楚。注意,讲清楚,并不需要你成为专家,能把assistant里面所有的知识点都能讲解到。学知识讲究一个循序渐进,对单个知识点的理解、认识也是逐步加深的,就像当下的深度学习、机器学习,从来没听说遍历第一遍样本就能学到位的。
===================================================================================================================
那么回到标题的第二部分:如何读取文本文件,在调试信息中输出呢?显然,这个命题并不难,我也没有掌握QFile和QTextStream类的所有知识点,但是我会讲解到目前11月20日我的理解。
首先,QT提供了非常丰富的C++库,就文本读写而言,使用较多的是QFile和QTextStream这两个类。
我们首先要将QFile这个类实例化,其方法就是构建一个QFile类的对象,即QFile file(...);
1 QFile file("qingtong.txt");
如上面这行,将建立一个QFile类的对象file,这个file在当前文件夹下的名称叫做qingtong.txt,我们可以将路径放在双引号内:
QFile file("C:/users/qingtong.txt");
文件对象定义好后,要打开它,要用到的是QFile类的成员函数open(),同时一般会定义打开方式和文本格式,一种最常用的方法是:
1 if (!file.open(QFile::ReadOnly|QFile::Text)) 2 { 3 qDebug("%s", qPrintable("Error: Can‘t open this file!")); 4 return a.exec(); 5 }
我对这段代码的看法是,先知道怎么用,再去理解代码每一行是什么意思,这里重点是将file.open操作放在if语句后面,在执行open操作后进行一次打开是否成功的判别,如果不成功就会执行括号内的语句,qDebug是一个QT的全局函数,其用法之一是上面这种,用于输出调试信息的。return a.exec()对应于main函数,上来就会先定义一个QApplication的对象a,这里返回a.exec(),也可以先不考虑为什么要这样做,先让程序能奔跑起来。
接着,将QTextStream这个类实例化,根据你要做的事(读in,写out)来创建对象,例如我现在要读,那么:
QTextStream in(&file);
这里的in是QTextStream的对象,括号内是QFile对象file的引用。
然后就可以开始读了,QTextStream有一些函数用于规定读的方式,使用较多的一种方式是调用readLine函数,即一行一行阅读。例如,我可以用:
1 QString list = in.readLine(); 2 qDebug("%s", qPrintable(list));
这两行代码来输出qingtong.txt文件的第一行内容。其中要注意:readLine前面调用该函数的对象是in,不是file,因为readLine函数是QTextStream类的函数,而不是QFile类的。在网上流传的某版本readLine用法代码中出现了这一处小问题,此处予以提示。
通过上面这几行简单的代码,你就可以自己实现一个小程序了,读出qingtong.txt文件的第一行,输出到调试信息中。完整代码如下:
1 #include <QApplication> 2 #include <QFile> 3 #include <QTextStream> 4 #include <QDebug> 5 #include <QString> 6 //头文件包含,如我这般萌新可以用到什么类就包含什么,其实有的类可以不包含,比如后两个。 7 8 int main(int argc, char *argv[]) 9 { 10 QApplication a(argc, argv); 11 QFile file("C:/users/qingtong.txt"); 12 if(!file.open(QFile::ReadOnly|QFile::Text)) 13 { 14 qDebug("%s", qPrintable("Error: Can‘t open this file!")); 15 return a.exec(); 16 } 17 QTextStream in(&file); 18 QString list = in.readLine(); 19 qDebug("%s", qPrintable(list)); 20 return a.exec(); 21 }
上述代码很快就实现了一个功能,是不是很简单呢?接下来要做的就是去不断扩充功能了,怎么样能把所有的文件都读出来呢?怎么样能用文本框输出呢?怎么样能再写入一个新的文本呢?这些问题能帮助你不断扩充这一个知识点。
这是第一篇日志,也是进军IT界的起点,相信到明年这个时候,再看这篇日志一定充满感触。它将不断完善,后续有关文件读写方面的知识,我都将附上更新时间,加在本篇日志的后面。