C语言文件读写操作详解

目录

文件打开方式

文件读取——单个字符

文件写入——单个字符

 文件读取——一行字符

文件写入——一行字符

文件读写——数据块

 文件读写——格式化

 文件读写——随机

文件复制:

完整代码示例: 

扫描二维码关注公众号,回复: 14650937 查看本文章

文件打开方式

文件读取——单个字符

void onlyRead_ByOneChar(char*filename){//从文件读取单个字符并输出 
	FILE*fp;
	char ch;
	if((fp=fopen(filename,"r"))==NULL){
		puts("open file error.");
		return;
	}
	//每次从文件读取一个字符并显示 
	while((ch=fgetc(fp))!=EOF){
		printf("%c",ch);
	}
	fclose(fp);
}

文件写入——单个字符

void overWrite_ByOneChar(char*filename){//从键盘输入单个字符并覆写文件 
	FILE*fp;
	char ch;
	if((fp=fopen(filename,"w+"))==NULL){
		puts("open file error.");
		return;
	}
	//每次从键盘读取一个字符并写入文件
	puts("写入规则:用|开头,并每个字段输入完用|结尾,最后一个字段不需要用|。"); 
    while ( (ch=getchar()) != '\n' ){
        fputc(ch,fp);
    }
    fclose(fp);
}

 文件读取——一行字符

void onlyRead_ByOneLine(char*filename){//从文件读取一行字符串并输出
	FILE *fp;
	const int N=101;//最多一次读N个字符 
	char str[N];
	if((fp=fopen(filename,"r"))==NULL){
		puts("open file error.");
		return;
	}
	 while(fgets(str, N, fp) != NULL){
        printf("%s", str);
    }
    fclose(fp);
}

文件写入——一行字符


void appendWrite_ByOneLine(char*filename){//从键盘输入一行字符串并追加写入文件 
	FILE *fp;
	const int N=101;//最多一次读N个字符 
	char str[N]={0},tempstr[N];
	if((fp=fopen(filename,"a+"))==NULL){
		puts("open file error.");
		return;
	}
	printf("请输入一行数据,写入规则:用|开头,并每个字段输入完用|结尾,最后一个字段不需要用|。:\n");
	gets(tempstr);
	strcat(str,"\r");//添加回车符 
	strcat(str,tempstr);
	fputs(str, fp);
    fclose(fp);
    return;
}

文件读写——数据块

void ReadAndWrite_ByDataBlock(char*filename){//从键盘写入数据再从文件读出(读写初始位置为文件头)
	const int N = 101; 
	 //从键盘输入的数据放入a,从文件读取的数据放入b
    char str_a[N], str_b[N];
    char size = sizeof(char);
    FILE *fp;
    
    if( (fp=fopen(filename, "rwb+")) == NULL ){  //以二进制方式打开
        puts("Fail to open file!");
        return;
    }
    
    //从键盘输入数据 并保存到数组a
    gets(str_a);
    int i,str_n=0;
    while(str_a[i]!='\0'){
    	i++;
	}
	str_n=i;
     //将字符串a的内容写入到文件
    fwrite(str_a, size, str_n, fp);
    //将文件中的位置指针重新定位到文件开头
    rewind(fp);
    //从文件读取内容并保存到数组b
    fread(str_b, size, str_n, fp);
    //在屏幕上显示数组b的内容
    puts(str_b);
    printf("\n");
    fclose(fp);
} 

 文件读写——格式化

void ReadAndWrite_ByFormat(char *filename){//格式化读写 
	 const int N=101;
	 char name[N]={0};
	 int age=0;
	 float score=0;
	 
	 FILE *fp;
	 if( (fp=fopen(filename,"wt+")) == NULL ){
        puts("Fail to open file!");
        return;
     }
    //从键盘读入数据
    printf("请输入姓名、年龄、分数:\n");
    scanf("%s%d%f",&name, &age, &score);   
    //将数据写入到文件
    fprintf(fp,"%s %d %f\n", name,age,score);   
	//重置文件指针
    rewind(fp);
    //从文件中读取数据
    fscanf(fp, "%s%d%f\n",&name,&age,&score);
    //将数据输出到显示器
    printf("%s %d %f\n", name,age,score);
    fclose(fp);
    return;
} 

 文件读写——随机

void ReadAndWrite_ByRandom(char *filename){//随机读写 
	const int N=3;
	struct stu{
   	 	char name[10]; //姓名
   	 	int num;  //学号
   	 	int age;  //年龄
    	float score;  //成绩
	}boys[N], boy, *pboys;
	 FILE *fp;
    int i;
    pboys = boys;
    if( (fp=fopen(filename, "wt+")) == NULL ){
        printf("Cannot open file, press any key to exit!\n");
        return; 
    }
    printf("Input data:\n");
    for(i=0; i<N; i++,pboys++){
        scanf("%s %d %d %f", pboys->name, &pboys->num, &pboys->age, &pboys->score);
    }
    fwrite(boys, sizeof(struct stu), N, fp);  //写入三条学生信息
    fseek(fp, sizeof(struct stu), SEEK_SET);  //移动位置指针
    fread(&boy, sizeof(struct stu), 1, fp);  //读取一条学生信息
    printf("%s  %d  %d %f\n", boy.name, boy.num, boy.age, boy.score);

    fclose(fp);
    return;
}

文件复制:

int copyFile(char *fileRead, char *fileWrite){//文件复制函数 
    FILE *fpRead;  // 指向要复制的文件
    FILE *fpWrite;  // 指向复制后的文件
    int bufferLen = 1024*4;  // 缓冲区长度
    char *buffer = (char*)malloc(bufferLen);  // 开辟缓存
    int readCount;  // 实际读取的字节数
    if( (fpRead=fopen(fileRead, "rb")) == NULL || (fpWrite=fopen(fileWrite, "wb")) == NULL ){
        printf("Cannot open file, press any key to exit!\n");
        getch();
        exit(1);
    }
    // 不断从fileRead读取内容,放在缓冲区,再将缓冲区的内容写入fileWrite
    while( (readCount=fread(buffer, 1, bufferLen, fpRead)) > 0 ){
        fwrite(buffer, readCount, 1, fpWrite);
    }
    free(buffer);
    fclose(fpRead);
    fclose(fpWrite);
    return 1;
}

void UseCopyFile(){//使用文件复制函数 
	char fileRead[100];  // 要复制的文件名
    char fileWrite[100];  // 复制后的文件名
   
    // 获取用户输入
    printf("要复制的文件:");
    scanf("%s", fileRead);
    printf("将文件复制到:");
    scanf("%s", fileWrite);
    // 进行复制操作
    if( copyFile(fileRead, fileWrite) ){
        printf("恭喜你,文件复制成功!\n");
    }else{
        printf("文件复制失败!\n");
    }

}

完整代码示例: 

#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
#include<conio.h>
void tip(){
	puts("功能列表:");
	puts("-----------------------");
	puts("------0、退出系统------");
	puts("------1、读取文件------");
	puts("------2、覆写文件------");
	puts("-----------------------");
	puts("请输入您的选择:");
}

void onlyRead_ByOneChar(char*filename){//从文件读取单个字符并输出 
	FILE*fp;
	char ch;
	if((fp=fopen(filename,"r"))==NULL){
		puts("open file error.");
		return;
	}
	//每次从文件读取一个字符并显示 
	while((ch=fgetc(fp))!=EOF){
		printf("%c",ch);
	}
	fclose(fp);
}

void overWrite_ByOneChar(char*filename){//从键盘输入单个字符并覆写文件 
	FILE*fp;
	char ch;
	if((fp=fopen(filename,"w+"))==NULL){
		puts("open file error.");
		return;
	}
	//每次从键盘读取一个字符并写入文件
	puts("写入规则:用|开头,并每个字段输入完用|结尾,最后一个字段不需要用|。"); 
    while ( (ch=getchar()) != '\n' ){
        fputc(ch,fp);
    }
    fclose(fp);
}

void onlyRead_ByOneLine(char*filename){//从文件读取一行字符串并输出
	FILE *fp;
	const int N=101;//最多一次读N个字符 
	char str[N];
	if((fp=fopen(filename,"r"))==NULL){
		puts("open file error.");
		return;
	}
	 while(fgets(str, N, fp) != NULL){
        printf("%s", str);
    }
    fclose(fp);
}

void appendWrite_ByOneLine(char*filename){//从键盘输入一行字符串并追加写入文件 
	FILE *fp;
	const int N=101;//最多一次读N个字符 
	char str[N]={0},tempstr[N];
	if((fp=fopen(filename,"a+"))==NULL){
		puts("open file error.");
		return;
	}
	printf("请输入一行数据,写入规则:用|开头,并每个字段输入完用|结尾,最后一个字段不需要用|。:\n");
	gets(tempstr);
	strcat(str,"\r");//添加回车符 
	strcat(str,tempstr);
	fputs(str, fp);
    fclose(fp);
    return;
}

void ReadAndWrite_ByDataBlock(char*filename){//从键盘写入数据再从文件读出(读写初始位置为文件头)
	const int N = 101; 
	 //从键盘输入的数据放入a,从文件读取的数据放入b
    char str_a[N], str_b[N];
    char size = sizeof(char);
    FILE *fp;
    
    if( (fp=fopen(filename, "rwb+")) == NULL ){  //以二进制方式打开
        puts("Fail to open file!");
        return;
    }
    
    //从键盘输入数据 并保存到数组a
    gets(str_a);
    int i,str_n=0;
    while(str_a[i]!='\0'){
    	i++;
	}
	str_n=i;
     //将字符串a的内容写入到文件
    fwrite(str_a, size, str_n, fp);
    //将文件中的位置指针重新定位到文件开头
    rewind(fp);
    //从文件读取内容并保存到数组b
    fread(str_b, size, str_n, fp);
    //在屏幕上显示数组b的内容
    puts(str_b);
    printf("\n");
    fclose(fp);
} 

void ReadAndWrite_ByFormat(char *filename){//格式化读写 
	 const int N=101;
	 char name[N]={0};
	 int age=0;
	 float score=0;
	 
	 FILE *fp;
	 if( (fp=fopen(filename,"wt+")) == NULL ){
        puts("Fail to open file!");
        return;
     }
    //从键盘读入数据
    printf("请输入姓名、年龄、分数:\n");
    scanf("%s%d%f",&name, &age, &score);   
    //将数据写入到文件
    fprintf(fp,"%s %d %f\n", name,age,score);   
	//重置文件指针
    rewind(fp);
    //从文件中读取数据
    fscanf(fp, "%s%d%f\n",&name,&age,&score);
    //将数据输出到显示器
    printf("%s %d %f\n", name,age,score);
    fclose(fp);
    return;
} 

void ReadAndWrite_ByRandom(char *filename){//随机读写 
	const int N=3;
	struct stu{
   	 	char name[10]; //姓名
   	 	int num;  //学号
   	 	int age;  //年龄
    	float score;  //成绩
	}boys[N], boy, *pboys;
	 FILE *fp;
    int i;
    pboys = boys;
    if( (fp=fopen(filename, "wt+")) == NULL ){
        printf("Cannot open file, press any key to exit!\n");
        return; 
    }
    printf("Input data:\n");
    for(i=0; i<N; i++,pboys++){
        scanf("%s %d %d %f", pboys->name, &pboys->num, &pboys->age, &pboys->score);
    }
    fwrite(boys, sizeof(struct stu), N, fp);  //写入三条学生信息
    fseek(fp, sizeof(struct stu), SEEK_SET);  //移动位置指针
    fread(&boy, sizeof(struct stu), 1, fp);  //读取一条学生信息
    printf("%s  %d  %d %f\n", boy.name, boy.num, boy.age, boy.score);

    fclose(fp);
    return;
}

int copyFile(char *fileRead, char *fileWrite){//文件复制函数 
    FILE *fpRead;  // 指向要复制的文件
    FILE *fpWrite;  // 指向复制后的文件
    int bufferLen = 1024*4;  // 缓冲区长度
    char *buffer = (char*)malloc(bufferLen);  // 开辟缓存
    int readCount;  // 实际读取的字节数
    if( (fpRead=fopen(fileRead, "rb")) == NULL || (fpWrite=fopen(fileWrite, "wb")) == NULL ){
        printf("Cannot open file, press any key to exit!\n");
        getch();
        exit(1);
    }
    // 不断从fileRead读取内容,放在缓冲区,再将缓冲区的内容写入fileWrite
    while( (readCount=fread(buffer, 1, bufferLen, fpRead)) > 0 ){
        fwrite(buffer, readCount, 1, fpWrite);
    }
    free(buffer);
    fclose(fpRead);
    fclose(fpWrite);
    return 1;
}

void UseCopyFile(){//使用文件复制函数 
	char fileRead[100];  // 要复制的文件名
    char fileWrite[100];  // 复制后的文件名
   
    // 获取用户输入
    printf("要复制的文件:");
    scanf("%s", fileRead);
    printf("将文件复制到:");
    scanf("%s", fileWrite);
    // 进行复制操作
    if( copyFile(fileRead, fileWrite) ){
        printf("恭喜你,文件复制成功!\n");
    }else{
        printf("文件复制失败!\n");
    }

}

int main(){
	int n; 
	char*filename="D:\\stu.txt";
	//调用函数 
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_51701007/article/details/128850461