题目:文件中有一组整数,要求排序后输出到另一个文件中。
本文考察两个方向,一个是文件读写操作,另外一个是排序。
关于排序这里就不详细说了,这里采用快速排序的方法。主要讲一下文件(文本文件)的读写操作问题,二进制文件先忽略,在大多面试题里面也不是特别需要:
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();
读文件:
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);
另外注意的是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); } }