文件读写问题 以及整数排序问题


题目:文件中有一组整数,要求排序后输出到另一个文件中。


本文考察两个方向,一个是文件读写操作,另外一个是排序。


关于排序这里就不详细说了,这里采用快速排序的方法。主要讲一下文件(文本文件)的读写操作问题,二进制文件先忽略,在大多面试题里面也不是特别需要:

一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); 
	}

}


4 完整的代码太长,就不放出来了,有人需要可以直接找我要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值