题目:文件中有一组整数,要求排序后输出到另一个文件中。
本文考察两个方向,一个是文件读写操作,另外一个是排序。
关于排序这里就不详细说了,这里采用快速排序的方法。主要讲一下文件(文本文件)的读写操作问题,二进制文件先忽略,在大多面试题里面也不是特别需要:
一c++中文件基本的读写:
c++中三个文件类:
fstream //文件流
ifstream //读文件流
ofstream//写文件流
使用它们的时候需要加入各自的头文件。
ifstream 类似于cin,以本文为例,我们要将input.txt中的整数读入到a[100]中,则可以这样做
ifstream infile("input.txt");//用构造函数打开input,也可以ifstream infile; infile.open("input.txt");
if (infle)
while (infile>>a[i]) //开始我喜欢在这里写成infile>>a[i++];但是会导致i在最后一次无效的时候也++导致统计长度的时候有问题。
i++;
我们可以看到>>符号在执行一次之后,infile就会往前进一个,其中infile是以空格和回车等符号作为间隔的。
写文件的方法
ofstream outfile("output.txt"); //打开文件
for (int j =0 ;j <num;j++)
{
outfile<<a[j]<<" "; //写文件
cout <<a[j]<<" "<<j<<endl;
}
outfile.close();
二 c语言的文件读写
读文件:
int a[100];
int num=0;
FILE *infile;
infile = fopen("input.txt", "r"); //打开文件
while(!feof(infile))
{
fscanf(infile, "%d", &a[num]); //读取文件
printf("%d \n", a[num]);
num++;
}
fclose(infile);
从里面可以看出面向过程和面向对象的区别,面向过程只是一个个独立的操作,必然fopen ,fscanf已经下面的fprintf,只是定义了一系列的操作对于文件,但是c++的面向对象则是先建立一个ifstream对象,然后所有的操作都是对象内部的操作,可以好好体会体会。
另外注意的是scanf 和fscanf 的最后一个参数都是指针。因为要改变一个数字必须传指针,c语言中。
写文件
FILE *outFile;
outFile = fopen("output.txt", "w");
for (int j =0 ;j <num;j++)
{
fprintf(outFile,"%d ", a[j]);
}
不用太多接受fprintf和prinft和类似,注意空格。而且最后一个参数不用指针,不用改变参数内容。
三排序内容,这里不做太多讲述,直接上代码了。
void swap (int &a ,int &b)
{
int tmp = a;
a = b;
b = tmp;
}
int partion(int *a, int start ,int end)
{
int key = a[end];
int lastNumber = end;
while (start < end)
{
while (a[start] <= key && start <end)
start++;
while (a[end] >= key && start <end)
end--;
if (start <end)
swap(a[start],a[end]);
}
swap(a[start],a[lastNumber]);
return start;
}
void quicksort(int *a, int start ,int end)
{
if (end > start)
{
int position = partion(a, start ,end);
quicksort(a, start, position-1);
quicksort(a, position+1, end);
}
}