什么是文件
在程序设计中,一般有两种文件:程序文件、数据文件
程序文件
包括源程序文件(后缀为.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语言中,stdin
、 stdout
、stderr
是三个重要的流(stream)标准,它们都是预定义的指针,指向标准输入流、标准输出流和标准错误流。
-
stdin
:标准输入流。它是一种输入数据的终端,通常来自于键盘或其他输入设备。可以使用scanf()
等函数从stdin
中读取输入数据。 -
stdout
:标准输出流。它是一种输出数据的终端,通常是显示器或其他输出设备。可以使用printf()
等函数将数据输出到stdout
中。 -
stderr
:标准错误流。它用于输出错误信息和诊断信息。通常也是输出到显示器,但与stdout
不同的是,stderr
的输出不会被标准输出重定向到其他设备,而会直接输出到显示器。文章来源:https://www.toymoban.com/news/detail-469095.html
这些流还可以通过文件重定向来实现输入/输出操作,例如,将标准输出重定向到文件中,将标准输入从文件中读取数据等等。这些流在很多操作系统的各种应用程序都是必不可少的,它们的使用使得进程的输入、输出和错误处理更加灵活和方便。文章来源地址https://www.toymoban.com/news/detail-469095.html
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int ch = fgetc(stdin);
fputc(ch, stdout);
return 0;
}
到了这里,关于第五十八天学习记录:C语言进阶:文件操作1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!