C++实践参考:小玩文件

【项目 - 小玩文件】
(下面是填好空的程序)
(1)下面程序的功能是统计文本文件abc.txt中的字符个数,请填空将程序补充完整。

#include <iostream>
#include <cstdlib>
#include <fstream> // (1)
using namespace std;
int main()
{
    fstream file;
    file.open("abc.txt", ios::in); // (2)
if(!file)
{
        cout<<"abc.txt can’t open."<<endl;
        exit(1);
    }
    char ch;
    int i=0;
    while(file.get(ch)) // (3)
    {
        ++i; // (4)
    }
    cout<<"Character: "<<i<<endl;
    file.close();// (5)
    return 0;
}

(2)下面程序的功能是将文本文件abc.txt中的所有行加上行号后写到newabc.txt文件中,请填空将程序补充完整。

#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
int main()
{
    fstream outfile,infile;
    infile.open("abc.txt",ios::in); // (1)
    if(!infile)
    {
        cout<<"Can’t open the file."<<endl;
        abort();
    }
    outfile.open("newabc.txt",ios::out);//(2)
    if(!outfile)
    {
        cout<<"Can’t open the file."<<endl;
        abort();
    }
    char buf[80];
    int i=1;
    while(!infile.eof()) // (3)
    {
        infile.getline(buf, 80); // (4)
        outfile<<i++<<": "<<buf<<endl; //(5)
    }
    infile.close();
    outfile.close();
    return 0;
}

PS:当abc.txt文件中存在长于80个字符的行时,程序会陷入死循环。通过跟踪发现,从当遇到这个“超长”的行时,infile.getline(buf, 80)先读出79个字符,以\0结束,之后再读,buf[0]总是\0,同时!infile.eof()为假,所以进入死循环。怀疑这其中该是这种“截断”式读取超长行带来的副作用。参看《getline的获取ifstream的数据》,其中给出了解释与对策。
显然,当初的这个程序并未考虑超长行,而是默认每一行都不会达80个字符而设计的。注意:如果某一行就这样被“截断”了,并不意味着这就是一行,直到找到换行符,才能说明这是一行的结束,行数i++才能执行,这个程序的改进又可以进行了。

时间: 2024-10-26 05:13:48

C++实践参考:小玩文件的相关文章

《C++语言基础》实践参考——小玩文件

返回:贺老师课程教学链接  项目要求 [项目1 - 小玩文件](1)下面程序的功能是统计文本文件abc.txt中的字符个数,请填空将程序补充完整. #include <iostream> #include <cstdlib> #include _____________ // (1) using namespace std; int main() { fstream file; file.open("abc.txt", _________); // (2) if

《C语言及程序设计》实践参考——小玩文件

返回:贺老师课程教学链接 [项目1 - 小玩文件] 1.下面程序的功能是统计文本文件abc.txt中的字符个数,请填空将程序补充完整. #include <stdio.h> #include <stdlib.h> int main() { FILE *fp; if((fp=fopen("abc.txt",_______))==NULL) //(1) { printf("open error!\n"); exit(1); } int i=0;

《C语言及程序设计》实践参考——乱玩数字

返回:贺老师课程教学链接  项目要求 [项目2:乱玩数字]编程输入整数a和b,若两数之和大于100,则输出两数和百位以上的数字,否则输出两数之和.[参考解答] #include <stdio.h> int main ( ) { int a, b, c; scanf("%d %d", &a, &b); c = a + b; if (c > 100) printf("两数和百位以上的数字是 %d\n", c/100); else pri

Raptor实践参考:大或小

返回->课程主页 2-1 大或小 从键盘输入任意整数N,当N小于或等于0时显示"low!",否则显示"high!" [参考解答]

《C语言及程序设计》实践参考——文件中的符号个数

返回:贺老师课程教学链接  项目要求 [项目2-文件中的符号个数]统计一个文本文件中数字.空格.字母出现的次数,以及文件的字节数,并将结果输出,文本文件名在程序中输入(请自建文本文件完成测试).[参考解答] #include "stdio.h" #include "stdlib.h" int main() { FILE *fp ; int alpha=0, number=0, space=0, count=0; //分别代表字母.数字.空格个数,及总字节数 char

《C语言及程序设计》实践参考——由键盘到文件

返回:贺老师课程教学链接  项目要求 [项目1-由键盘到文件](1)从键盘输入一个文件名,以及一个以#结束的字符序列,将输入的字符保存到文件中去. #include "stdio.h" #include "stdlib.h" int main() { FILE *fp ; char ch,fname[10]; printf("文件名:"); gets(fname); if ((fp=____(1)____)==NULL) { printf(&qu

C++语言实践参考——用文件保存的学生名单

[项目-用文件保存的学生名单] 文件score.dat中保存的是若干名学生的姓名和C++课.高数和英语成绩.(1)定义学生类,其中包含姓名.C++课.高数和英语成绩及总分数据成员. //定义学生类 class Student{ public: //声明必要的成员函数 private: string name; double cpp; double math; double english; double total; static int stu_num; //学生人数,处理为类的静态成员合适

《C语言及程序设计》实践参考——玩转日期和时间

返回:贺老师课程教学链接 [项目2-玩转日期和时间] 定义一个表示时间(包括年.月.日.时.分.秒)的结构体,然后完成下面的功能. 提示:将各个功能分别设计成函数实现,在main函数中调用,进行测试.可以设计一个函数,即刻进行测试,以降低复杂度. 要实现的功能是: (1)输入一个时间(注意各部分数据的取值范围)将输入的时间保存在一个结构体变量中: (2)输出该日在本年中是第几天(注意闰年问题): (3)输出这是这一天中的第几秒: (4)输出这是这一年中的第几秒:(不要认为这个数荒唐,在计算中需要

《C语言及程序设计》实践参考——玩数字

返回:贺老师课程教学链接  C语言及程序设计初步  项目要求 要求:输入3个双精度实数,分别求出它们的和.平均值.平方和以及平方和的开方,并输出所求出各个值. [参考解答] #include <stdio.h> #include <math.h> //sqrt需要math.h int main( ) { float x, y, z; float sum, avg, sq_sum, root; scanf("%f %f %f", &x, &y, &