C语言文件操作(针对一些竞赛所需要的形式)

前言:

      C语言文件的操作有很多大佬都已经写过,而且书上也很详细。因为最近在看一些竞赛题(C/C++),所以就会用到将字符数据或者整型数据复制粘贴到文本文件中,然后用代码读取数据,这里就用几个简单的例子重新来一遍吧,最后会有一个小小的文件合并demo。
     在我上代码之前,我们还是来回顾一下相关的操作:

一、熟悉一下相关的知识:

模式 含义 说明
r 只读 文件必须存在,否则打开失败
w 只写 若文件存在,则清除原文件内容后写入;否则,新建文件后写入
a 追加只写 若文件存在,则位置指针移到文件末尾,在文件尾部追加写入,若文件不存在,则打开失败
r+ 读写 文件必须存在,可读可写
w+ 读写 新建一个文件,可读可写
a+ 读写 追加可写基础上增加可读
rb 二进制度 以二进制打开




**文件打开模式:FILE * fopen(char filename, char mode)

函数参数:
filename:文件名,包括路径,如果不显式含有路径,则表示当前路径。例如,“D:\f1.txt”表示 D 盘根目录下的文件 f1.txt 文件。“f2.doc”表示当前目录下的文件 f2.doc。
mode:文件打开模式,指出对该文件可进行的操作。常见的打开模式如 “r” 表示只读,“w” 表示只写,“rw” 表示读写,“a” 表示追加写入。

*文件关闭模式:int fclose(FILE fp)

fp:已打开的文件指针。
返回值:正常关闭,返回否则返回 EOF(-1)。




读写操作的相关函数:

函数名称 函数原型 函数功能 注意事项
字符输入函数fgetc int fgetc(FILE *fp) 从文件指针 fp 所指向的文件中读入一个字符。读入成功,返回该字符;已读取到文件末尾,或遇到其他错误,即输入失败,则返回文本文件结束标志 EOF(EOF 在 stdio.h 中已定义,一般为 -1) 由于 fgetc 是以 unsigned char 的形式从文件中输入(读取)一个字节,并在该字节前面补充若干 0 字节,使之扩展为该系统中的一个 int 型数并返回,而非直接返回 char 型。当输入失败时返回文本文件结束标志 EOF 即 -1,也是整数。故返回类型应为 int 型,而非 char 型
字符输出函数fputc int fputc(int c,FILE *fp) 向 fp 指针所指向的文件中写入字符 c,输出成功,返回该字符;输出失败,则返回 EOF(-1) 因为本片博客很少涉及这些详细知识,所以省略,下同
字符串输入函数fgets char * fgets (char *s, int size, FILE * fp) 从 fp 所指向的文件内,读取若干字符(一行字符串),并在其后自动添加字符串结束标志 ‘\0’ 后,存入 s 所指的缓冲内存空间中(s 可为字符数组名),直到遇到回车换行符或已读取 size-1 个字符或已读到文件结尾为止。该函数读取的字符串最大长度为 size-1 省略
字符串输出函数 int fputs (const char *str, FILE *fp) 把 str(str 可为字符数组名)所指向的字符串,输出到 fp 所指的文件中 省略
文件格式化输入函数 int fscanf (文件指针,格式控制串,输入地址表列) 从一个文件流中执行格式化输入,当遇到空格或者换行时结束。注意该函数遇到空格时也结束,这是其与 fgets 的区别,fgets 遇到空格不结束 例如:fscanf (fp,"%d",&a) ; //从fp所指文件中读取一个整数保存到变量a中
文件格式化输出函数 int fprintf (文件指针,格式控制串,输出表列) 把输出表列中的数据按照指定的格式输出到文件中 省略



二、从.txt文件中读入几行整型数据

     例如,我要从test.txt文件中读入数据并且存到我的数组中
在这里插入图片描述

      那么代码有:

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
	int a[3][4];//定义我需要的数组
	FILE *fp = fopen("D:\\test.txt","r");//打开D盘下的文件 
	if(fp==NULL)//打开失败 
	{
		cout<<"打开失败"<<endl;//当然,做题目的时候其实不用这个。 
	}	
	for(int i=0;i<3;i++)//读入文件数据初始化数组 
	{
		for(int j=0;j<4;j++)
		{
			fscanf(fp,"%d",&a[i][j]);
		}
	}	
	fclose(fp);
	for(int i=0;i<3;i++)//打印输出检查是否读取成功 
	{
		for(int j=0;j<4;j++)
		{
			cout<<a[i][j]<<" ";
			if(j==3) cout<<endl; 
		}
	}
	return 0; 
}

输出结果就是
在这里插入图片描述
     上面我用到了二维数组,有些时候只是一堆的数字,你可以定义一维数组来进行读入。



三、读入字符数据

      在test.txt文件中复制粘贴代码,例如:C++ is best language!,那么我们编写程序读入并且输出来验证。

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
	char c[20];
	FILE *fp = fopen("D:\\test.txt","r");
	if(fp==NULL) cout<<"打开失败"<<endl;
	fgets(c,20,fp);
	fclose(fp);
	cout<<c<<endl;
	return 0;
}

     最后就会在屏幕上输出
在这里插入图片描述
     当然,其实方式有很多种,也可以用fputc或fscandf。


四、文件合并小demo

     把两个文件合并,这个例子可以体会到文件相关的操作。来看看吧:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *f_file1,*f_file2,*f_finish;//文件指针 
    char ch,file1_name[20],file2_name[20],finish_name[20];

    printf("请输入需要合成的文件1和文件2的名称:\n");
    printf("文件1:\n");
    scanf("%s",&file1_name);
    printf("文件2:\n");
    scanf("%s",&file2_name);
    printf("生成为:");
    scanf("%s",finish_name);
//原理就是二进制打开两个文件,创建一个新的文件,二进制写入 
    if(!(f_file1 = fopen(file1_name,"rb")))//二进制读,进行判断是否打开判断,下皆同 
    {
        printf("Cannot open the file1 %s! ",file1_name);
        exit(0);
    }
    if(!(f_file2 = fopen(file2_name,"rb")))
    {
        printf("Cannot open the file %s!",file2_name);
        exit(0);
    }
    if(!(f_finish = fopen(finish_name,"wb")))//写判断 
    {
        printf("Cannot open the file %s!",finish_name);
        exit(0);
    }

	ch=fgetc(f_file1);//读入字符 
    while(!(feof(f_file1)))//结束标志 
    {
        
        fputc(ch,f_finish);//写入到目标文件 
		ch = fgetc(f_file1);
    }
//以下皆同 
    fclose(f_file1);

	ch = fgetc(f_file2);
    while(!(feof(f_file2)))
    {
        fputc(ch,f_finish);
		ch = fgetc(f_file2);
    }
    fclose(f_file2);
    fclose(f_finish);
    printf("合并成功!!\n");
    system("pause");
    return 0;
}

在这里插入图片描述
在这里插入图片描述

总结:

     上面的例子都有很多种方式,但是竞赛使用的无非也就是读入并初始化我们需要的数据(这只是一种工具,但是我们要熟练使用)。最后的文件合并是利用二进制文件的原理来实现,具体实现也是和之前的小demo一样简单。
     希望对你们有帮助,如有误,请指出,谢谢。

发布了123 篇原创文章 · 获赞 234 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43919400/article/details/104878280
今日推荐