第五十八天学习记录:C语言进阶:文件操作1

文章介绍了程序设计中的文件类型,包括程序文件和数据文件,详细讲解了文件的命名、文件指针、打开方式以及读写操作。还特别提到了文本文件和二进制文件的区别,并通过示例代码展示了如何用C语言进行文件读写。此外,文章还讨论了标准输入流(stdin)、标准输出流(stdout)和标准错误流(stderr)的概念和作用。
摘要由CSDN通过智能技术生成

什么是文件

在程序设计中,一般有两种文件:程序文件、数据文件

程序文件

包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。

数据文件

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

文件

一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀
例如:C:\code\test.txt
为了方便起见,文件标识常被称为文件名

文件类型

根据数据的组织形式,数据文件被称为文本文件或者二进制文件
数据在内存中以二进制的形式存储,如果不加以转换的输出到外存,就是二进制文件
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	int a = 10000;
	FILE* pf = fopen("test.txt", "wb");//wb用二进制的形式写
	fwrite(&a, 4, 1, pf);//二进制的形式写到文件中
	//写一个四字节的数据
	fclose(pf);
	pf = NULL;
	return 0;
}

该代码会在工程目录下生成如下文件
在这里插入图片描述
直接打开是乱码:
在这里插入图片描述
用VS二进制方式打开:
在这里插入图片描述
在这里插入图片描述
因为是小端模式,得出最终表现的十六进制形式是:27 10,转换成16进制就是10000

文件缓冲区

ANSIC标准采用缓冲文件系统处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

在这里插入图片描述
上图转自比特科技。

文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE
在这里插入图片描述
在编写程序的时候,在打开文件的同时,都会返回一个FILE* 的指针变量指向该文件,也相当于建立了指针和文件的关系。
ANSIC规定使用fopen函数来打开文件,fclose来关闭文件。

FILE* fopen(const char* filename,const char* mode);
int fclose(FILE* stream);

打开方式如下:

文本使用方式含义如果指定文件不存在
“r”(只读)为了输入数据,打开一个已经存在的文本文件出错
“w”(只写)为了输出数据,打开一个文本文件建立一个新的文件
“a”(追加)向文本文件尾添加数据出错
“rb”(只读)为了输入数据,打开一个二进制文件出错
“wb”(只写)为了输出数据,打开一个二进制文件建立一个新的文件
“ab”(追加)向一个二进制文件尾添加数据出错
“r+”(读写)为了读和写,打开一个文本文件出错
“w+”(读写)为了读和写,建立一个新的文件建立一个新的文件
“a+”(读写)打开一个文件,在文件尾进行读写建立一个新的文件
“rb+”(读写)为了读和写打开一个二进制文件出错
“wb+”(读写)为了读和写,新建一个新的二进制文件建立一个新的文件
“ab+”(读写)打开一个二进制文件,在文件尾进行读和写建立一个新的文件
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	//打开文件test.txt
	//相对路径
	//..表示上一级路径
	//.表示当前路径
	//fopen("../../test.txt","r");
	//fopen("test.txt","r");
	//绝对路径写法
	fopen("F:\\aha\\test.txt","r");
	return 0;
}

问://fopen(“./test.txt”,“r”); //fopen(“test.txt”,“r”);有什么区别?
ChatAI答:
这两个语句的作用都是打开文件"test.txt",并以只读模式®进行访问。但它们的路径表示方式略有不同。

第一个语句 fopen("./test.txt", "r") 中的 “./” 表示当前路径,也就是表示在当前目录下寻找名为"test.txt"的文件。这个语句会在程序的当前工作目录下寻找"test.txt"这个文件,而不会去其他目录下查找。如果当前工作目录下不存在这个文件,则无法打开它。

第二个语句 fopen("test.txt", "r") 则表示在文件的相对路径中寻找名为"test.txt"的文件。如果这个相对路径中的文件存在,程序就会打开它。但是如果这个文件不存在,程序将无法打开它。

因此,当程序运行的环境有多个工作目录时,使用第一个语句可以更加确保打开正确的文件。而当程序运行的环境中只有一个工作目录时,这两个语句都可以正确地打开文件。

文件的顺序读写

文本使用方式函数名适用于
字符输入函数fgetc所有输入流
字符输出函数fputc所有输出流
字本行输入函数fgets所有输入流
文本行输出函数fputs所有输出流
格式化输入函数fscanf所有输入流
格式化输出函数fprintf所有输出流
二进制输入fread文件
二进制输出fwrite文件

写文件

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main()
{
	FILE* pfWrite=fopen("F:\\aha\\test.txt","w");
	if (pfWrite == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//写文件
	fputc('C', pfWrite);
	fputc('h', pfWrite);
	fputc('u', pfWrite);
	fputc('n', pfWrite);
	fputc('g', pfWrite);
	//关闭文件
	fclose(pfWrite);
	pfWrite = NULL;
	return 0;
}

读文件

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main()
{
	FILE* pfRead = fopen("F:\\aha\\test.txt", "r");
	if (pfRead == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//读文件
	printf("%c", fgetc(pfRead));
	printf("%c", fgetc(pfRead));
	printf("%c", fgetc(pfRead));
	printf("%c", fgetc(pfRead));
	printf("%c", fgetc(pfRead));
	//关闭文件
	fclose(pfRead);
	pfRead = NULL;
	return 0;
}

从键盘输入
输出到屏幕
键盘&屏幕都是外部设备

键盘-标准输入设备 stdin
屏幕-标准输出设备 stdout
是一个程序默认打开的两个流设备
stdin FILE*
stdout FILE*
stderr FILE*

问:介绍一下stdin stdout stderr
ChatAI答:
在C语言中,stdinstdoutstderr 是三个重要的流(stream)标准,它们都是预定义的指针,指向标准输入流、标准输出流和标准错误流。

  1. stdin:标准输入流。它是一种输入数据的终端,通常来自于键盘或其他输入设备。可以使用scanf()等函数从stdin中读取输入数据。

  2. stdout:标准输出流。它是一种输出数据的终端,通常是显示器或其他输出设备。可以使用printf()等函数将数据输出到stdout中。

  3. stderr:标准错误流。它用于输出错误信息和诊断信息。通常也是输出到显示器,但与stdout不同的是,stderr的输出不会被标准输出重定向到其他设备,而会直接输出到显示器。

这些流还可以通过文件重定向来实现输入/输出操作,例如,将标准输出重定向到文件中,将标准输入从文件中读取数据等等。这些流在很多操作系统的各种应用程序都是必不可少的,它们的使用使得进程的输入、输出和错误处理更加灵活和方便。

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	int ch = fgetc(stdin);
	fputc(ch, stdout);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值