C语言 —— 文件处理
今日一言:
我们之所以努力,不是为了改变世界,
而是为了不让世界改变我们。
C语言 —— 文件处理
一、实验目的二、 实验内容1. 验证性实验2. 设计性实验
一、实验目的
掌握文件、文件系统和文件指针的概念。
掌握关于文件的建立/打开、文件的关闭、文件的读写、文件错误的检测登系统标准函数的使用方法。
掌握使用缓冲文件系统进行简单文件处理的方法。
二、 实验内容
1. 验证性实验
仔细阅读下面的C语言源程序,指出程序的功能。
#include "stdio.h"
#include "stdlib.h"
void main(){
void delcomm(FILE *fp1, FILE *fp2);
FILE *fp1, *fp2;
char source[80],target[80];
printf("Input source file name: ");
gets(source);
printf("Input target file name: ");
gets(target);
if( (fp1=fopen(source, "r")) == NULL ){
printf("Can't open source file.\n");
exit(0);
}
if ( (fp2=fopen(target, "w")) == NULL ){
printf("Can't creat target file.\n");
exit(0);
}
delcomm(fp1,fp2);
fclose(fp1);
fclose(fp2);
}
void delcomm(FILE *fp1, FILE *fp2 ){
char c;
int i = 0;
while( (c=fgetc(fp1)) != EOF )
if( c == '\n' )
fprintf(fp2,"\n");
else
switch(i){
case 0 :
if ( c=='/' )
i = 1;
else
fprintf(fp2,"%c",c);
break;
case 1 :
if ( c=='*' )
i = 2;
else{
fprintf( fp2, "/%c", c );
i = 0;
}
break;
case 2 :
if ( c=='*' )
i = 3;
break;
case 3 :
i = ( c=='/' )? 0 : 2;
break;
}
}
程序功能: 删除注释,删除掉"/"与"/"所包围起来的所有内容。
运行结果:
Input source file name: D:\\java1.txt
Input target file name: D:\\java.txt
--------------------------------
Process exited after 12 seconds with return value 0
请按任意键继续. . .
java1.txt内容:
aaa11111
/*bbb22222*/
ccc33333
ddd44444
运行程序后java.txt内容:
aaa11111
ccc33333
ddd44444
2. 设计性实验
(1) 分别用无参主函数、有参主函数及自定义函数将一个文本文件f1复制到f2中。
无参主函数程序:
#include <stdio.h>
#include <stdlib.h>
void main(){
FILE *f1, *f2;
char p1[200], p2[200],buff[1024];
int count;
printf("请输入f1:");
gets(p1);
printf("请输入f2:");
gets(p2);
if( (f1=fopen(p1,"r")) == NULL ) exit(1);
if( (f2=fopen(p2,"w+")) == NULL ) exit(1);
while( (count = fread(buff,sizeof(char),1024,f1)) > 0 ){
fwrite(buff,count,1,f2);
}
fclose(f1);
fclose(f2);
}
运行结果(复制成功)
请输入f1:D:\\java1.txt
请输入f2:D:\\java.txt
--------------------------------
Process exited after 7.817 seconds with return value 0
请按任意键继续. . .
有参主函数程序:
#include <stdio.h>
#include <stdlib.h>
void main( int argc, char *argv[], char *envp[] ){
FILE *f1, *f2;
char *p1, *p2,buff[1024];
int count;
p1 = argv[1];
p2 = argv[2];
printf("资源文件路径:%s\n",p1);
printf("操作文件路径:%s\n",p2);
if( (f1=fopen(p1,"r")) == NULL ) exit(1);
if( (f2=fopen(p2,"w+")) == NULL ) exit(1);
while( (count = fread(buff,sizeof(char),1024,f1)) > 0 ){
fwrite(buff,count,1,f2);
}
fclose(f1);
fclose(f2);
}
运行结果(复制成功)
资源文件路径:D:\\java1.txt
操作文件路径:D:\\java.txt
--------------------------------
Process exited after 0.2074 seconds with return value 0
请按任意键继续. . .
有参主函数程序:
#include <stdio.h>
#include <stdlib.h>
void copyFile( char *p1 , char *p2 ){
FILE *f1, *f2;
char buff[1024];
int count;
printf("资源文件路径:%s\n",p1);
printf("操作文件路径:%s\n",p2);
if( (f1=fopen(p1,"r")) == NULL ) exit(1);
if( (f2=fopen(p2,"w+")) == NULL ) exit(1);
while( (count = fread(buff,sizeof(char),1024,f1)) > 0 ){
fwrite(buff,count,1,f2);
}
fclose(f1);
fclose(f2);
}
void main( int argc, char *argv[], char *envp[] ){
copyFile(argv[1],argv[2]);
}
运行结果(复制成功)
资源文件路径:D:\\java1.txt
操作文件路径:D:\\java.txt
--------------------------------
Process exited after 0.2074 seconds with return value 0
请按任意键继续. . .
编程序实现比较两个文本内容是否相同的程序,文件内容相同时输出'OK',不同时输出"not same!"。要求被比较的两个文件名从命令行输入。
程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int IsequalFile( char *p1 , char *p2 ){
FILE *f1, *f2;
char buff1[1024],buff2[1024];
int c1,c2 , flag = 1;
printf("资源文件路径:%s\n",p1);
printf("操作文件路径:%s\n",p2);
if( (f1=fopen(p1,"r")) == NULL ) exit(1);
if( (f2=fopen(p2,"r")) == NULL ) exit(1);
while( flag ){
if( (c1=fread(buff1,sizeof(char),1024,f1)) <= 0 ) flag = 0;
if( (c2=fread(buff2,sizeof(char),1024,f2)) > 0 ){
if ( !flag || c1 != c2 ) {
return 0;
}
if ( strcmp(buff1,buff2) == -1 ) return 0;
} else {
if( flag ) return 0;
}
}
fclose(f1);
fclose(f2);
return 1;
}
void main( int argc, char *argv[], char *envp[] ){
if ( IsequalFile(argv[1],argv[2]) ){
printf("OK\n");
} else {
printf("no same!\n");
}
}
运行结果
两个文件是运行过上题的复制程序的,所以文本内容等价。
资源文件路径:D:\\java1.txt
操作文件路径:D:\\java.txt
OK
--------------------------------
Process exited after 0.1541 seconds with return value 0
请按任意键继续. . .