C语言文件操作(上)

这节来探讨一下C语言里的文件操作。 

目录

一、打开文件

二、输入数据 

2.1 字符

2.2 文本行

2.3 格式化文本

2.4 二进制

2.5 sscanf与sprintf

2.6 随机读写


一、打开文件

打开文件,就是获取文件的有关信息,

这些信息会被保存到一个 FILE 类型的结构体变量中,它包含了所有用来控制流的必要的信息。

关闭文件就是断开与文件之间的联系,释放结构体变量,同时禁止再对该文件进行操作。

打开成功后结束使用要记得关闭文件。

FILE *fopen( const char *filename, const char *mode );

我们可以使用 fopen() 函数来创建一个新的文件或者打开一个已有的文件,

这个调用会初始化类型 FILE 的一个对象,关闭文件则使用fclose()函数。

在这里,filename 是文件名;访问模式 mode 的值可以是下列值中的一个:

 如果是二进制文件,则需使用下面的访问模式:

"rb", "wb", "ab", "rb+", "wb+", "ab+"

来个栗子:

int main()
{
    //打开文件
    FILE* pf = fopen("data.txt", "r");

    if (pf == NULL)
    {
        //空指针打开异常
        perror("fopen");
        return -1;
    }

    //关闭文件
    fclose(pf);
    pf == NULL
    return 0;
}

    

二、输入数据 

能打开文件了,接下来我们要输入数据。

2.1 字符

这里主要使用两个函数:fgetc()、fputc()

int fgetc( FILE *stream );//读取
int fputc( int c, FILE *stream );//输入

字符输入:

int main()
{
    FILE* pf = fopen("data.txt", "w");
    if (NULL == pf)
    {
        perror("fopen");
        return -1;
    }
    
    fputc("b", pf);
    fclose(pf);
    pf = NULL;
    return 0;
}

字符输出:

int main()
{
    FILE* pf = fopen("data.txt", "r");
    if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}
	int ch = fgetc(pf);
	printf("%c", ch);
	fclose(pf);
	pf = NULL;
	return 0;
}

2.2 文本行

一个字符肯定满足不了,这是需要字符串来表达怎么办呢?

int fputs( const char *string, FILE *stream );
char *fgets( char *string, int n, FILE *stream );

这里要注意以下fgets()函数的n,如果写4,实际只读三个数据,

它会默认在第四个位置方上 '\0' 作为结束标志。

输入:

fputs("bit", pf);

输出:

char ch[20] = { 0 };
fgets(ch, 4, pf);//只读三个数据
printf("%s", ch);

2.3 格式化文本

int fprintf( FILE *stream, const char *format [, argument ]...);
int fscanf( FILE *stream, const char *format [, argument ]... );

这个两个函数后面的参数与printf内的参数一模一样。

输入:

int ch = 4;
fprintf(pf, "%d", ch);

输出:

int ch = 0;
fscanf(pf, "%d", &ch);
printf("%d", ch);

2.4 二进制

这种是以二进制的方式写入文本,也对应两个函数。

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );

 buffer就是存放写入或输出的指针

将count个size大小的数据从文件中放入或取出

输入注意要 'wb', 输出则'rb'

输入:

int ch = 5;
fwrite(&ch, sizeof(ch), 1, pf);
//将一个ch大小的数从ch中取出存入pf中

输出:

int ch = 0;
fread(&ch, sizeof(ch), 1, pf);
printf("%d", ch);

2.5 sscanf与sprintf

提到fscanf与fprintf,这里有必要提两个函数。

int sscanf( const char *buffer, const char *format [, argument ] ... );
int sprintf( char *buffer, const char *format [, argument] ... );

这个函数就是将一个格式化的数据转换为字符串,看栗子:

struct S
{
	int n;
	double d;
	char name[10];
};

int main()
{
	char arr[100] = { 0 };

	struct S tmp = { 0 };
	struct S s = { 100, 3.14, "zhangsan" };
	//把一个格式化的数据转换成字符串
	sprintf(arr, "%d %lf %s", s.n, s.d, s.name);
	//打印
	printf("%s\n", arr);

	//从arr中的字符串中提取出一个格式化的数据
	sscanf(arr, "%d %lf %s", &(tmp.n), &(tmp.d), tmp.name);
	//打印
	printf("%d %lf %s\n", tmp.n, tmp.d, tmp.name);

	return 0;
}

2.6 随机读写

这里虽然写着随机,但并不是真正意义上的随机。

有三个函数:

 

第一个是读取文件指定位置的字符

第二个是返回文件内所指向的位置

第三个是回到文件的起始处

fseek的第三个参数:

用法如下: (文件内存着abcdef)

int main()
{
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}

	fseek(pf, 2, SEEK_CUR);//指向文件内的第二个字符
	int ch = fgetc(pf);
	printf("%c\n", ch);

	int s = ftell(pf);//显示偏移量
	printf("%d\n", s);

	rewind(pf);//回到起始位置
	ch = fgetc(pf);
	printf("%c\n", ch);

	fclose(pf);
	pf = NULL;
	return 0;
}

结果如下: 

 

    

感谢你能看到这,如有帮助,欢迎点个赞👍。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶chuchu丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值