一.什么是文件
文件是存储在计算机系统中的一组有序的数据集合,可以包含文本、图像、音频、视频等各种信息形式。文件可以通过文件系统进行管理和组织,可以被读取、写入、修改和删除。文件是计算机系统中存储和处理数据的基本单位,能够对数据进行持久化存储,方便用户使用和管理。
但是在程序设计中我们一般将文件以文件的功能分为两类:程序文件和数据文件.
1.程序文件
包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(Windows环境后缀为.exe)
2.数据文件
数据文件是存储数据的文件。它可以包含各种类型的数据,例如文本、数字、图形、音频等。数据文件通常以二进制或文本格式保存,可以通过计算机程序来读取和写入数据。
数据文件可以储存在计算机的硬盘驱动器或其他存储介质上,如固态硬盘、USB闪存驱动器、光盘等。常见的数据文件格式包括CSV(逗号分隔值)、XML(可扩展标记语言)、JSON(JavaScript对象表示)等。
二.文件名
文件名是一个用来标识和区分不同文件的字符串或标签。它通常是文件在文件系统中的唯一标识符,并且由字母、数字、下划线和其他特定字符组成。文件名通常用来指定文件的类型、内容和用途,以方便用户和计算机系统进行管理和访问。在某些操作系统中,文件名的长度和允许的字符集可能有限制。
文件名包含三个部分:文件路径+文件名主干+文件后缀
比如:D:\biangcheng\编程\文件操作\test.c
三.文件的打开和关闭
下面是一个利用C语言文件操作的示例:
#include <stdio.h>
int main() {
// 创建文件//fopen为打开文件
FILE *file = fopen("test.txt", "w");
if (file == NULL) {
printf("无法创建文件!\n");
return -1;
}
// 写入数据到文件
char str[] = "Hello, World!";
fputs(str, file);
// 关闭文件
fclose(file);
// 打开文件进行读取
file = fopen("test.txt", "r");
if (file == NULL) {
printf("无法打开文件!\n");
return -1;
}
// 从文件中读取数据并输出
char buffer[100];
fgets(buffer, sizeof(buffer), file);
printf("文件内容:%s\n", buffer);
// 关闭文件
fclose(file);
return 0;
}
文件的打开如同喝水一般:想要喝一瓶矿泉水就有三步 1 打开水瓶盖(上述代码中的打开文件夹)
2.喝水(对代码的读取以及输入或输出) 3.关闭水瓶盖(关闭文件).
上述代码首先创建一个名为test.txt
的文件,并将字符串"Hello, World!"写入到文件中。然后,重新打开该文件进行读取,将文件内容读取到一个缓冲区中,并输出到终端上。最后,关闭文件。
在使用文件操作函数时,需要注意以下几点:
fopen
函数用于打开文件,第一个参数是文件路径,第二个参数是打开方式(如“w”表示写入方式,"r"表示读取方式)。fputs
函数用于向文件写入字符串。fclose
函数用于关闭文件。fgets
函数用于从文件中读取字符串。- 在进行文件操作时,应该检查文件是否成功打开或关闭。
在上面代码利用了文件指针
文件指针是指在程序中用于访问文件的一个指针变量。它记录了当前读取或写入文件的位置,通过文件指针,程序可以在文件中移动,读取或写入特定位置的数据。文件指针通常用于文件的打开、关闭、读取和写入操作。在不同的编程语言中,文件指针的实现方式有所不同,但其基本原理相同。
一般都是用过一个FILE的指针来维护这个FILE结构的变量
*FILE ps;
文件其中还有很多打开模式.
四.文件顺序的读写
函数名 | 功能 | 适用于 |
fgetc | 字符输入函数 | 所有输入流 |
fputc | 字符输出函数 | 所有输出流 |
fgets | ⽂本⾏输⼊函数 | 所有输⼊流 |
fputs | ⽂本⾏输出函数 | 所有输出流 |
fscanf | 格式化输⼊函数 | 所有输⼊流 |
fprintf | 格式化输出函数 | 所有输出流 |
fread | ⼆进制输⼊ | 文件 |
fwrite | ⼆进制输出 | 文件 |
4.1 fputs文本行写入(输出到文件里)
fputc函数是在C语言中用于将一个字符写入到文件中的函数。它的函数原型如下:
int fputc(int c, FILE *stream);
参数c表示要写入的字符,stream表示要写入的文件流。该函数将返回写入成功的字符。
示例用法:
#include <stdio.h>
int main()
{
FILE *file = fopen("test.txt", "w");
if (file == NULL)
{
printf("无法打开文件");
return 1;
}
fputc('H', file);
fputc('e', file);
fputc('l', file);
fputc('l', file);
fputc('o', file);
fclose(file);
return 0;
}
上述代码将字符序列"Hello"写入到名为"test.txt"的文件中。当文件打开失败时,会返回"无法打开文件"并终止程序。
4.2 关于fgets文本行读取
fgets函数是C语言中的一个输入函数,用于从文件流中读取一行字符串。
函数原型如下:
char *fgets(char *str, int char, FILE *stream);
参数说明: str:指向字符数组的指针,用于存储读取到的字符串。 n:指定最多读取的字符数,包括最后的换行符(如果有的话)。 stream:指向FILE对象的指针,表示要读取的文件流。
返回值: 如果成功,返回str的值;如果读取到文件结束符或发生错误,返回NULL。
使用示例:
#include <stdio.h>
int main()
{
FILE *file = fopen("input.txt", "r");
char buffer[256];
if (file)
{
while (fgets(buffer, sizeof(buffer), file))
{
printf("%s", buffer);
}
fclose(file);
}
return 0;
}
以上示例中,fgets函数会从文件流中读取一行字符串保存到buffer中,然后使用printf函数打印出来。循环执行直到文件结束。最后需要关闭文件流。
4.3 fputc字符写入
fputc函数是C语言中的一个输出函数,它用于将一个字符写入到指定的文件中。
函数原型如下:
int fputc(int char, FILE *stream);
参数说明:
- c: 要写入的字符
- stream: 指定要写入字符的文件流
返回值:
- 如果写入成功,返回写入的字符;如果写入失败,返回EOF。
示例代码:
#include <stdio.h>
int main() {
FILE *file = fopen("text.txt", "w");
if (file == NULL) {
printf("文件打开失败\n");
return -1;
}
char ch = 'A';
if (fputc(ch, file) == EOF) {
printf("写入失败\n");
return -1;
}
printf("写入成功\n");
fclose(file);
return 0;
}
以上代码将字符'A'写入到文件text.txt中。如果写入成功,输出"写入成功";如果写入失败,输出"写入失败"。
4.4 fgetc字符串读取
fgetc函数是C语言中的标准库函数,用于从文件中读取一个字符。函数原型如下:
int fgetc(FILE *stream)
参数stream是一个指向FILE对象的指针,它指向要读取的文件流。函数返回读取的字符,如果到达文件末尾或发生错误,返回EOF(表示End-of-File)。
下面是一个示例,演示如何使用fgetc函数逐个字符地从文件中读取并输出:
#include <stdio.h>
int main() {
FILE *file;
char c;
file = fopen("file.txt", "r");
if(file == NULL) {
printf("Failed to open file.\n");
return -1;
}
while ((c = fgetc(file)) != EOF) {
printf("%c", c);
}
fclose(file);
return 0;
}
在上面的示例中,我们首先打开一个名为"file.txt"的文件,并进行错误检查。然后,使用while循环和fgetc函数从文件中读取每个字符,并使用printf函数将其输出到屏幕上。循环继续,直到读取到文件末尾为止。最后,使用fclose函数关闭文件。
请注意,fgetc函数每次只能读取一个字符。如果需要读取一行或更多的字符,可以使用fgets函数。另外,要记得在使用完文件后关闭它,以释放资源。
其中与上方的fgets有很多相似之处
fgets和fgetc是C语言中的两个输入函数,用于从文件中读取字符。它们的相同之处如下:
- 都可以用于从文件中读取字符。
- 都需要一个文件指针作为参数。
- 都可以逐个字符地读取文件内容。
- 都会在遇到文件结尾或读取到指定字符时停止读取。
需要注意的是,fgets函数可以一次读取多个字符,并且会包括换行符在内,而fgetc函数每次只能读取一个字符。另外,fgets函数返回一个字符串指针,而fgetc函数返回一个整数。
fgets和fgetc都是C语言中用于读取文件的函数,但两者有一些区别。
参数不同:fgets函数的参数包括一个字符数组指针、读取字符的最大数量和文件指针,而fgetc函数的参数只有一个文件指针。
功能不同:fgets函数用于一次读取一行字符,包括换行符,直到遇到换行符或读取到指定数量的字符为止。而fgetc函数用于一次读取一个字符。
返回值不同:fgets函数返回读取到的字符数组指针,如果读取失败或到达文件结尾,则返回NULL。而fgetc函数返回读取到的字符或EOF(如果到达文件结尾)。
使用范围不同:fgets函数常用于处理文本文件的逐行读取,而fgetc函数可用于读取任意类型的文件。
综上所述,fgets适合读取文本文件的一行字符,而fgetc适合逐个字符地读取文件的内容。
4.5 fseek
根据⽂件指针的位置和偏移量来定位⽂件指针。
fseek函数是C语言中的文件定位函数。
int fseek(FILE *stream, long int offset, int whence);
参数说明:
- stream:文件指针,指向要移动文件位置指针的文件。
- offset:偏移量,即要移动的字节数。
- whence:指定一个起始位置,可以取以下值:
- SEEK_SET:从文件起始位置开始。
- SEEK_CUR:从当前位置开始。
- SEEK_END:从文件末尾位置开始。
返回值说明:
- 返回0表示移动成功。
- 返回非0值表示移动失败。
使用fseek函数可以实现以下功能:
- 定位到文件的指定位置进行读写操作。
- 定位到文件末尾添加数据(利用fseek(stream, 0, SEEK_END))。
- 获取当前文件指针的位置(利用ftell函数)。
需要注意的是,fseek函数的offset参数指定的是字节数,而不是行数或字符数。
#include <stdio.h> int main() { FILE *fp = fopen("file.txt", "r"); if (fp == NULL) { printf("Failed to open file.\n"); return 1; } // 定位文件指针到第10个字节处 if (fseek(fp, 10, SEEK_SET) != 0) { printf("Failed to seek file.\n"); fclose(fp); return 1; } // 读取文件中的内容 char buffer[100]; if (fgets(buffer, sizeof(buffer), fp) != NULL) { printf("Read content: %s", buffer); } else { printf("Failed to read file.\n"); } fclose(fp); return 0; }
在上面示例中我们首先打开了一个名为file.txt的文本文件,然后使用fseek函数将文件指针定位到第10个字节处,最后读取了文件中的内容并打印出来。
4.6 printf fprintf sprintf 区别
printf、fprintf和sprintf都是C语言中用于输出信息的函数,但它们在输出的方式和输出的位置上有所不同。
printf函数:用于将格式化的数据输出到标准输出(通常是显示器)。它的函数原型为:
int printf(const char *format, ...);示例:
printf("Hello, world!\n"); printf("The value of x is %d\n", x);
fprintf函数:用于将格式化的数据输出到指定的文件中。它的函数原型为:
int fprintf(FILE *stream, const char *format, ...);示例:
FILE *file = fopen("output.txt", "w"); fprintf(file, "Hello, world!\n"); fprintf(file, "The value of x is %d\n", x); fclose(file);
sprintf函数:将格式化的数据输出到字符串中。它的函数原型为:
int sprintf(char *str, const char *format, ...);示例:
char str[100]; sprintf(str, "Hello, world!\n"); sprintf(str, "The value of x is %d\n", x);
总结:printf函数接将输出信息显示在屏幕上,fprintf函数将输出信息写入指定的文件,而sprintf函数将输出信息保存到一个字符串中。
4.7 scanf fscanf sscanf 区别
scanf、fscanf和sscanf是C语言中常用的输入函数,主要用于从标准输入或文件中读取数据。它们之间的区别如下:
scanf:从标准输入读取数据,格式化输入。可以读取多个变量,以空格、制表符或换行符分隔。返回成功读取的参数数目。
fscanf:从文件中读取数据,格式化输入。与scanf类似,可以读取多个变量,以空格、制表符或换行符分隔。返回成功读取的参数数目。
sscanf:从字符串中读取数据,格式化输入。与scanf和fscanf不同,它不是从标准输入或文件中读取数据,而是从字符串中解析数据。返回成功读取的参数数目。
总结:
scanf用于从标准输入读取数据,fscanf用于从文件中读取数据,sscanf用于从字符串中读取数据。它们的参数格式和用法类似,返回值表示成功读取的参数数目。
五.文本文件与二进制文件
根据数据的组织形式,数据文件被称为文本文件或者二进制文件.
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件.
文本文件和二进制文件在存储和处理方式上也有一些不同。文本文件可以直接在文本编辑器中打开、编辑和保存,而二进制文件通常需要通过特定的程序进行读取和处理。在存储方面,文本文件通常占用的空间较小,因为它们使用的是字符编码来存储数据;而二进制文件由于可以存储任意类型的数据,所以占用的空间较大。
总结来说,文本文件适用于存储和处理纯文本数据,易于理解和编辑;而二进制文件适用于存储和处理任意类型的数据,可以保存更多的细节和信息。两者在实际应用中常常相互转换和配合使用,以满足不同的需求。