目录
2. 假定有两个文本文件("a.txt"、"b.txt"),请编程将它们合并为第三个文本文件("c.txt")
3.由键盘输入n和m,编程将n~m之间的素数保存到一个文本文件("sushu.txt")中
4. 已经有一个文本文件("data.txt"),内容包括多名学生的信息
5.一个文本文件有多行信息,编写程序读取其内容,统计最长的一行信息和最短的一行信息各有多少个字符
6. 假定有一个文本文件,请编程分别将它每行字符串逆序和全部行逆行保存到第2和第3个文本文件中
7.编写一个程序,要求读出一个cpp文件中的C++语法保留字(至少10个)到另一个文本文件中。 比如:main、while、return、...
8.编写一个程序,要求读出三个文本文件中共同行的内容保存到第四个文本文件中, 不同行的内容保存到第五个文本文件中
题目内容
1. 编写一个程序,可以读入一个C++语言的源文件
每一行加上行号后保存到另一个后缀为.prn的同名文件中。
#include<iostream>
#include<fstream>
#include<iomanip>
#include<string>
using namespace std;
int main()
{
//打开文件
ifstream fin("3-1.cpp");
ofstream fout;
char filename[20] = "3-1.prn"; //string 不能作为文件名输入...;
fout.open(filename,ios::app|ios::out);
if(!fin||!fout)
{
cout<<"不可以打开文件"<<endl;
return 1;
}
//读文件
char ch[100];
while(fin)
{
if(fin)
{
fin.getline(ch,99); //这里的fin.getline有点类似cin.getline,可以保留空格的那种,如果是普通的,就是单个字符,遇到空格会分开
cout<<ch<<'\n';
fout<<ch<<'\n';
}
}
//关闭文件
fin.close();
fout.close();
cout<<"已经输出";
return 0;
}
2. 假定有两个文本文件("a.txt"、"b.txt"),请编程将它们合并为第三个文本文件("c.txt")
合并规则如下:
交替取前两个文本文件的每一行,并依次放入第三个文本文件中。
第3个文件的内容如下:
第1文件的第1行
第2文件的第1行
第1文件的第2行
第2文件的第2行
......
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
//open
ifstream f1("3-1.cpp"), f2("3-2.cpp");
ofstream f3;
f3.open("c.txt",ios::out|ios::app);
if(!f1||!f2||!f3)
{
cout<<"文件打开失败"<<endl;
return 1;
}
//operate
while(f1&&f2)
{
if(f1&&f2){
char x[100],y[100];
f1.getline(x,99);
f2.getline(y,99);
f3<<x<<'\n'<<y<<'\n';
cout<<x<<'\n'<<y<<'\n';
}
}
//close
f1.close();
f2.close();
f3.close();
cout<<"ok";
return 0;
}
3.由键盘输入n和m,编程将n~m之间的素数保存到一个文本文件("sushu.txt")中
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
bool issushu(int x)
{
bool flag=true;
for(int i = 2;i<=x/2;i++)
{
if(x%i==0)
{
flag=false;
return flag;
}
}
return flag;
}
int main()
{
ofstream f1;
f1.open("sushu.txt",ios::out|ios::app);
int n,m;
cout<<"please input n and m:";
cin>>n>>m;
for(int i=n;i<m+1;i++)
{
if(issushu(i))
{
f1<<i<<'\n';
}
}
return 0;
}
4. 已经有一个文本文件("data.txt"),内容包括多名学生的信息
学号、姓名、班级、分数1、分数2、分数3
请读取其中的每个学生信息,计算总分并显示出来。
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
int main()
{
ifstream f1;
char num[20];
char name[20];
char banji[10];
int score1,score2,score3;
while(f1)
{
if(f1)
{
f1>>num>>name>>banji>>score1>>score2>>score3;
cout<<num<<'\t'<<name<<'\t'<<banji<<'\t'<<score1<<'\t'<<score2<<'\t'<<score3;
int all_score;
all_score=score1+score2+score3;
cout<<'\t'<<all_score<<endl;
}
}
return 0;
}
5.一个文本文件有多行信息,编写程序读取其内容,统计最长的一行信息和最短的一行信息各有多少个字符
#include<iostream>
#include<fstream>
#include<iomanip>
#include<cstring>
using namespace std;
int main()//对于char 数组,sizeof和strlen 不一样
{
ifstream f1("3-1.cpp");
char temp[1000];
int max,min;
f1.getline(temp,999);
max=strlen(temp);
min=strlen(temp);
while(f1)
{
if(f1)
{
f1.getline(temp,999);
//cout<<'\n'<<temp<<'\n';
if(max<strlen(temp))
{
max=strlen(temp);
}
else if(min>strlen(temp))
{
max=strlen(temp);
}
}
}
cout<<min<<'\n'<<max;
return 0;
}
6. 假定有一个文本文件,请编程分别将它每行字符串逆序和全部行逆行保存到第2和第3个文本文件中
附加知识点
#include<iostream>
#include <string>
using namespace std;
int main()
{
string str("cvicses");
string s(str.rbegin(),str.rend());
cout << s <<endl;
return 0;
}
//既然是c++的string,可以考虑用用string的反向迭代器了
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
//假定有一个文本文件,请编程分别将它每行字符串逆序和全部行逆行保存到第2和第3个文本文件中。
ofstream f2,f3;
ifstream f1("3-1.cpp");
f2.open("3-1-12-6.txt");
f3.open("3-1-12-6-1.txt");
string x[100];
int n=0;
while(f1)
{
if(f1)
{
string x1;
f1>>x1;
x[n]=x1;
n++;
string x2(x1.rbegin(),x1.rend());//string逆序的写法
// cout<<x2<<endl;
f2<<x2<<endl;
}
}
//cout<<"___________________";
for(int i=0;i<n;i++)
{
f3<<x[n-1-i]<<endl;
//cout<<x[n-1-i]<<endl;
}
}
7.编写一个程序,要求读出一个cpp文件中的C++语法保留字(至少10个)到另一个文本文件中。 比如:main、while、return、...
#include<iostream>
#include<fstream>
#include<iomanip>
//Q:这里的main()需不需要去括号,好家伙,直接find就结束了
//这里的main,还有return是提前弄好的吗 ,是哒
using namespace std;
int main()
{
ifstream f1("3-1.cpp");
ofstream f2;
f2.open("3-1-read.txt",ios::out);
string s[10];
s[0]="main";
s[1]="while";
s[2]="return";
s[3]="if";
s[4]="cout";
s[5]="cin";
s[6]="include";
int num=4;
while(f1)
{
if(f1)
{
string x;
f1>>x;
for(int i=0;i<7;i++)
{
if(x.find(s[i])!=x.npos)
{
f2<<s[i]<<endl;
break;
}
}
}
}
f1.close();
f2.close();
return 0;
}
遇到的问题
我用了string 的find
但我定义了整数,把find的返回值赋给他,他在显示屏上才显示整数,否则就显示一些很奇怪的数字
我感觉也不像数字,更像是一个地址
原本的-1变成了18446。。。这些的
原因:
std::string::find找不到的返回值严格来说不是-1
我感觉他返回的应该是string::npos的值,然后这个最诡异的是如果我把这个npos赋给一个整数,这个整数就变成-1了.....如果我直接输出,就是court<<x.find(s[i])它就这样
-1的补码是11111....11(如果是整型,就是32位1)
但是size_t是无符号的,所以1111…11就被当作一个很大的正整数输出了
把它赋给整型变量其实进行了一次类型转换
正确写法
应该写为:
if(x.find((s[i])!=x.npos){ //找到
...
}else{
...
}
8.编写一个程序,要求读出三个文本文件中共同行的内容保存到第四个文本文件中, 不同行的内容保存到第五个文本文件中
知识点:
string按行读取 getline(in,string);
char 按行读取 in.getline(char,n);
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
//8.编写一个程序,要求读出三个文本文件中共同行的内容保存到第四个文本文件中,不同行的内容保存到第五个文本文件中。
//我有一个大胆的想法,但是感觉挺蠢的,不管了,能做出来就是好的。。。。
ifstream f1("3-1.cpp"),f2("3-2.cpp"),f3("3-3.cpp");
ofstream f4,f5;
f4.open("12-8-1.txt");
f5.open("12-8-2.txt");
string x1[100],x2[100],x3[100];
int n1=0,n2=0,n3=0;
while(f1)
{
if(f1)
{
string y1;
getline(f1,y1);
x1[n1]=y1;
n1++;
}
}
while(f2)
{
if(f2)
{
string y2;
getline(f2,y2);
x2[n2]=y2;
n2++;
}
}
while(f3)
{
if(f3)
{
string y3;
getline(f3,y3);
x3[n3]=y3;
n3++;
}
}
//相同的部分 ,一次3for结构
int flag1=-1;
for(int i=0;i<n1;i++)
{
for(int j=0;j<n2;j++)
{
if(x1[i]==x2[j])
{
for(int k=0;k<n3;k++)
{
if(x1[i]==x3[k])
{
f4<<x1[i]<<endl;
// cout<<x1[i]<<endl;
flag1=0;
break;
}
}
if(flag1==0)
{
flag1=-1;
break;
}
}
}
}
//不同的结构,三个不同的,三个3for结构
//cout<<"不一样"<<endl;
//3-1
int flag2=-1;
for(int i=0;i<n1;i++)
{
for(int j=0;j<n2;j++)
{
if(x1[i]!=x2[j])
{
for(int k=0;k<n3;k++)
{
if(x1[i]==x3[k])
{
flag2=0;
break;
}
}
if(flag2==0)
{
break;
}
}
else
{
flag2=0;
break;
}
}
if(flag2==-1)
{
f5<<x1[i]<<'\n';
// cout<<x1[i]<<endl;
}
else
{
flag2=-1;
}
}
//3-2
flag2=-1;
for(int i=0;i<n2;i++)
{
for(int j=0;j<n1;j++)
{
if(x2[i]!=x1[j])
{
for(int k=0;k<n3;k++)
{
if(x2[i]==x3[k])
{
flag2=0;
break;
}
}
if(flag2==0)
{
break;
}
}
else
{
flag2=0;
break;
}
}
if(flag2==-1)
{
f5<<x2[i]<<'\n';
// cout<<x2[i]<<endl;
}
else
{
flag2=-1;
}
}
//3-3
flag2=-1;
for(int i=0;i<n3;i++)
{
for(int j=0;j<n2;j++)
{
if(x3[i]!=x2[j])
{
for(int k=0;k<n1;k++)
{
if(x3[i]==x1[k])
{
flag2=0;
break;
}
}
if(flag2==0)
{
break;
}
}
else
{
flag2=0;
break;
}
}
if(flag2==-1)
{
f5<<x3[i]<<'\n';
// cout<<x3[i]<<endl;
}
else
{
flag2=-1;
}
}
}