c语言文件操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言文件操作相关的知识,希望对你有一定的参考价值。

在本目录下有一个文件叫number_in.txt,里面全部是用逗号分隔的数字,现在要求你把这些数字获取到,然后升序排序后,重新用空格分割,输出到number_out.txt文件内。如果打开文件失败,则输出open file error。谁帮我做下 !非常感谢!

//完全ok了  我这边没你的那个txt  你用你的试试

 

我上图了 如果看不见 请鄙视百度

#include<stdio.h>

#include <stdlib.h>

main()

 int i,j,n=0,tmp,arr[128]=0;

 FILE *fp=NULL,*fpw=NULL;

 

 if ( (fp=fopen("number_in.txt","r"))==NULL  )

 

  printf("open file error!\\n");

  exit(1);

 

 

 while (fscanf(fp,"%d,",&arr[n++])!=EOF);

 fclose(fp);

 for (i=0;i<n-1;i++)

 

  for (j=0;j<n-i-1;j++)

 

   if (arr[j]>arr[j+1])

   

    tmp = arr[j];

    arr[j] = arr[j+1];

    arr[j+1] = tmp;

   

 

 

 fpw = fopen("number_out.txt","w");

 for (i=0;i<n;i++)

 

  fprintf(fpw,"%d ",arr[i]);

 

 fclose(fpw);

 

追问

多了一个零!不过还是很感谢哈!

追答

哈哈 在fclose(fp); 下面加一个n--;就OK了

参考技术A /*
12 36 52 789 12 45 65 98 75 84 96 36 92 19 57 57
Press any key to continue
*/
#include <stdio.h>#include <stdlib.h>
int main()
FILE *fin,*fout;
int num;
char comma;
fin = fopen("number_in.txt","rt");
fout = fopen("number_out.txt","wt");
if(!fin || !fout)
printf("open file error!\n");
exit(1);

while(!feof(fin))
fscanf(fin,"%d%c",&num,&comma);
fprintf(fout,"%d ",num);
printf("%d ",num);

printf("\n");
fclose(fin);
fclose(fout);
return 0;
追问

没有排序 不过很感谢!

参考技术B 都来做作业,将来怎么办? 参考技术C 数据量有多大?追问

大概有100个数字和100个逗号!

追答

那用数组就行,稍等

追问

恩 谢谢哈

追答

我编译通过了,因为要下班了,没有测试,如果有问题,稍微调整一下就行
代码如下:
#include
#include
#include

#define NUM 128
#define LEN 16
//数据量比较小,直接用插入排序
void my_sort(int a[], int n)

int i,j,temp;
for (i=1; i=0; j++)

if (a[j]>a[i])

a[j+1] = a[j];

else

break;


a[j+1] = temp;



void InAndPut()

int i,j,k;
FILE *pfRead = fopen("a.txt", "r");
FILE *pfWrite = fopen("b.txt", "w");
char chBuffer[NUM][LEN] = 0;
int iBuffer[NUM] = 0;

if (NULL == pfRead)

printf("error:打开文件a.txt失败\n");
exit(-1);


//读取数据
for (i=0; i<NUM && !feof(pfRead); i++)

for (j=0; j<LEN; j++)

chBuffer[i][j] = fgetc(pfRead);
if (',' == chBuffer[i][j])

chBuffer[i][j] = '\0';
break;




//将读取的数据转换成数字类型存放到iBuffer里
for (k=0; k<i; k++)

iBuffer[k] = atoi(chBuffer[k]);


my_sort(iBuffer, i);
for (k=0; k<i; k++)

fprintf(pfWrite, "%d ", iBuffer[k]);


fclose(pfWrite);
fclose(pfRead);

int main()

InAndPut();
system("pause");
return 0;

追问

谢谢!

C 语言文件操作 ( C 语言中的文件操作函数 | 磁盘与内存缓冲区 | 缓冲区工作机制 )





一、C 语言中的文件操作函数



读取 文本文件 可以使用 getc , fgets , fscanf 函数 , 向 文本文件 写出数据可以使用 putc , fputs , fprintf 函数 ;

读取 二进制文件 可以使用 fread 函数 , 向 二进制文件 写出数据可以使用 fwrite 函数 ;





二、磁盘与内存缓冲区



上述所有读写文件的函数 , 都是缓冲区函数 , 即 C 语言中的文件操作 , 都是缓冲区函数 ;


磁盘 是由 操作系统 进行读写的 , 用户写的程序 , 不能直接操作磁盘 ;

操作系统 提供 读写文件的 系统调用 接口 , 在该接口上 是 C 语言的库函数 , 最上层就是 用户程序 ;


如果要操作硬件磁盘 , 就需要知道磁盘的驱动程序 , 磁盘扇区操作等 , 这就比较复杂了 ;


C 语言库函数 中 , 维护了一个缓冲区 , 这个缓冲区是 内存 中的缓冲区 ;

使用 C 语言文件操作函数 读写的 数据 , 不是直接来自磁盘 , 而是来自 内存中缓冲区 ;





三、缓冲区工作机制



缓冲区工作机制 :

如果 缓冲区大小 64KB , 假如使用 C 语言库函数 fread 读取一个字节数据 , 实际上会从磁盘文件中读取 64KB 数据 , 放入内存缓冲区中 ;

这是因为 读写内存的效率 远远高于 读写磁盘的效率 ;

这样的好处是 , 读取第 2 个字节时 , 可以直接从内存中读取 , 不需要再次读写磁盘 ;


该机制可以 增加用户程序的执行效率 , 减少磁盘访问次数 ;

磁盘有读写寿命 , 读写次数到了 , 磁盘就会报废 ;


缓冲区内容写入磁盘的时机 :

  • 缓冲区满了
  • 调用 fclose 关闭文件函数

以上是关于c语言文件操作的主要内容,如果未能解决你的问题,请参考以下文章

C 语言文件操作 ( C 语言中的文件操作函数 | 磁盘与内存缓冲区 | 缓冲区工作机制 )

C语言文件操作,请高手指点

用C语言实现文件读写操作

c语言文件操作

C语言关于文件的操作

C语言文件操作详解