vlambda博客
学习文章列表

C语言 —— 文件处理

今日一言:
我们之所以努力,不是为了改变世界,
而是为了不让世界改变我们。

C语言 —— 文件处理

一、实验目的二、 实验内容1. 验证性实验2. 设计性实验

一、实验目的

  1. 掌握文件、文件系统和文件指针的概念。

  2. 掌握关于文件的建立/打开、文件的关闭、文件的读写、文件错误的检测登系统标准函数的使用方法。

  3. 掌握使用缓冲文件系统进行简单文件处理的方法。


二、 实验内容

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

运行结果(复制成功)

请输入f1D:\\java1.txt
请输入f2D:\\java.txt

--------------------------------
Process exited after 7.817 seconds with return value 0
请按任意键继续. . .

有参主函数程序:

#include <stdio.h>
#include <stdlib.h>

void mainint 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 copyFilechar *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 mainint 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 IsequalFilechar *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 mainint 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
请按任意键继续. . .