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
请按任意键继续. . .
 
 