C语言——文件操作

简介: C语言——文件操作

1.什么是文件


磁盘上的文件是文件。

但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件


1.程序文件

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


2.数据文件

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


本章讨论的是数据文件。

在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。



2.文件名


一个文件要有一个唯一的文件标识,以便用户识别和引用。

文件名包含3部分:文件路径+文件名主干+文件后缀

例如: c:\code\test.txt

为了方便起见,文件标识常被称为文件名。



3.文件类型


文件类型有很多,以下是一些常见的文件类型:


文字文件,如.txt、.doc、.docx、.pdf、.rtf等。它们通常包含文本信息,可以用文本编辑器或文档处理软件打开和编辑。


图像文件,如.jpg、.png、.gif、.bmp等。它们通常包含图像信息,可以用图像编辑软件打开和编辑。


音频文件,如.mp3、.wav、.aac、.flac等。它们通常包含声音信息,可以用音频播放器或音频编辑软件播放和编辑。


视频文件,如.mp4、.avi、.mov、.wmv等。它们通常包含视频信息,可以用视频播放器或视频编辑软件播放和编辑。


压缩文件,如.zip、.rar、.7z等。它们通常包含多个文件或文件夹,可以用压缩软件解压缩。


可执行文件,如.exe、.dll、.bat等。它们通常是计算机程序,可以在计算机上运行。


数据文件,如.csv、.xlsx、.dbf等。它们通常包含数据信息,可以用数据处理软件打开和处理。


网页文件,如.html、.htm、.php等。它们通常包含网页代码,可以用浏览器查看。



4.文件指针


冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE.

例如,VS2008编译环境提供的 stdio.h 头文件中有以下的文件类型申明:


struct _iobuf {
    char *_ptr;
    int  _cnt;
    char *_base;
    int  _flag;
    int  _file;
    int  _charbuf;
    int  _bufsiz;
    char *_tmpfname;
   };
typedef struct _iobuf FILE;

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。

每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。

一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

下面我们可以创建一个FILE*的指针变量:

FILE* pf;//文件指针变量

定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。


比如:

image.png

5.文件的打开和关闭


文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。


在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。

ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。


FILE * fopen ( const char * filename, const char * mode );
 
filename:文件名        mode:打开方式
 
int fclose ( FILE * stream );

文件路径:相对路径和绝度路径

相对路径     . 表示当前路径

                .. 表示上一级路径


例如:


int main()
{
  //打开文件
  //FILE* pf = fopen(".\..\\..\\data.txt", "r");//相对路径
  //FILE* pf = fopen("D:\\code\\2023\\class111\\data.txt", "r");//绝对路径
  FILE* pf = fopen("data.txt", "r");
  if (pf == NULL)
  {
    perror("fopen");
    return 1;
  }
  //写文件
  //...
  
  //关闭文件
  fclose(pf);
  pf = NULL;
 
  return 0;
}

打开方式如下:


文件使用方式                         含义  如果指定文件不存在

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


实例代码:

FILE * fopen ( const char * filename, const char * mode );
int fclose ( FILE * stream );
/* fopen fclose example */
#include <stdio.h>
int main ()
{
 FILE * pFile;
 pFile = fopen ("myfile.txt","w");
 if (pFile!=NULL)
{
  fputs ("fopen example",pFile);
  fclose (pFile);
}
 return 0;
}

6.文件的顺序读写


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

image.png

image.png

对比一组函数:  

               scanf/fscanf/sscanf

               printf/fprintf/sprintf


scanf是格式化的输入函数,针对是标准输入流(键盘)

printf是格式化的输出函数,针对的是标准出流(屏幕)

scanf:和printf是针对标准输入/输出流的格式化输入/输出函数

fscanf是针对所有输入流(文件流、标准输入流)的格式化输入函数

fprintf是针对所有输出流(文件流、标准输出流)的格式化输出函数

sscanf:将字符串转成格式化的数据

sprintf:将格式化的数据转换成字符串


1. fgetc

fgetc()函数是C语言标准库中的一个函数,用于从指定的文件流中读取一个字符


int fgetc(FILE *stream);

其中,stream为指向FILE类型的指针,指向要读取的文件流。


函数返回值为读取的字符,如果读取失败或到达文件结尾,则返回EOF(-1)。


使用fgetc()函数时,需要先打开文件流,可以使用fopen()函数打开文件,然后使用fclose()函数关闭文件流。在读取文件时,可以使用循环结构来读取文件中的所有字符,直到读取到文件结尾或出现错误为止。


使用fgetc()函数从文件中读取字符并输出:

#include <stdio.h>
 
int main() {
    FILE *fp;
    int c;
 
    fp = fopen("test.txt", "r");
    if (fp == NULL) {
        printf("Failed to open file.\n");
        return 1;
    }
 
    while ((c = fgetc(fp)) != EOF) {
        putchar(c);
    }
 
    fclose(fp);
    return 0;
}

2.fputc

fputc函数是一个适用于所有输出流的字符输出函数,它的作用是将一个字符写入到指定的文件中。


int fputc(int c, FILE *stream);

其中, c是要写入的字符,stream是指向要写入的文件的指针。如果函数执行成功,则返回写入的字符,否则返回EOF。


下面是一个使用fputc函数将字符写入文件的例子:


#include <stdio.h>
int main()
{
    FILE *fp;
    char ch = 'A';
    fp = fopen("test.txt", "w");
    if(fp == NULL)
    {
        printf("文件打开失败!");
        return 0;
    }
    fputc(ch, fp);
    fclose(fp);
    return 0;
}

image.png


3.fgets  

fgets是C语言中的一个函数,它用于从指定的流中读取一行数据,直到达到指定的最大字符数或者遇到换行符或EOF(End Of File,文件结束标志)。


char *fgets(char *

4.fputs  

fputs是C语言中的一个函数,用于将一个字符串写入到指定的文件流中,将一个字符串输出到指定的文件中,通常用于向文件中写入数据。


其函数原型如下:


int fputs(const char *str, FILE *stream);

参数解释:


  • str:这是指向要写入的字符串的指针。
  • stream:这是指向FILE对象的指针,该对象指定了一个输出流。

fputs函数将字符串写入文件流,直到遇到字符串结束符\0为止。如果成功写入字符串,则函数返回一个非负值;否则,返回EOF(-1)。

#include <stdio.h>
 
int main() {
    FILE *fp;
    char str[] = "Hello, World!";
 
    fp = fopen("output.txt", "w");  // 以写入模式打开文件
    if (fp == NULL) {
        perror("Error opening file");  // 打开文件失败
        return -1;
    }
 
    if (fputs(str, fp) == EOF) {  // 写入字符串到文件中
        perror("Error writing to file");  // 写入文件失败
        return -1;
    }
 
    fclose(fp);  // 关闭文件
    return 0;
}

5.fscanf  

scanf函数是C语言标准库中的一个函数,用于从文件中读取格式化输入。


它的定义如下:


int fscanf(FILE *stream, const char *format, ...);

该函数从指定的流(stream)中读取数据,按照format中指定的格式进行解析,将解析出的数据存储到对应的变量中。其返回值为成功读取和解析的匹配项数量。


例如,以下代码可以从文件中读取一个整数并将其存储到变量n中:

#include <stdio.h>
 
int main() {
    FILE *fp = fopen("test.txt", "r");
    int n;
    if (fscanf(fp, "%d", &n) == 1) {
        printf("读取到的整数为:%d\n", n);
    } else {
        printf("读取失败!\n");
    }
    fclose(fp);
    return 0;
}

注意,在使用fscanf函数时需要注意格式字符串(format),格式字符串中使用了与printf函数类似的转换说明符,如%d表示读取一个整数,%f表示读取一个浮点数,%s表示读取一个字符串等。如果格式字符串中包含多个转换说明符,则对应传入的参数数量应与之相等,并且按照从左到右的顺序进行对应。在读取字符串时,需要特别注意字符串中不能有空格或换行符,否则会导致读取失败。


6.fprintf  

fprintf函数是C语言中的一个标准函数, 用于将数据按照一定的格式输出到文件中。


其基本用法为:

int fprintf(FILE *stream, const char *format, ...);

参数解释:


  • stream:要输出到的文件指针,可以是标准输出、标准错误或者用户指定的文件指针。
  • format:输出格式字符串,与 printf 函数的格式字符串相同。
  • ...:可变参数列表,与 printf 函数的参数相同。

fprintf函数的返回值为成功写入文件的字符数。如果出现错误则返回一个负数。


举个例子,输出字符串到标准输出:


#include <stdio.h>
 
int main() {
    char str[] = "Hello, world!";
    fprintf(stdout, "%s\n", str);
    return 0;
}

在这个例子中,fprintf函数将字符串 str 输出到了标准输出 stdout 中,输出的格式为字符串 %s。\n 表示换行。如果想将字符串输出到文件中,只需要将 stdout 替换为自定义的文件指针即可。


7.fread

read() 函数是用于从文件中读取二进制数据(如图像,音频等)的标准C函数。


它的语法如下:


size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

它的参数解释如下:

  • ptr:指向要读取数据的缓冲区的指针。
  • size:每个数据项的大小(单位是字节)。
  • count:要读取的数据项数。
  • stream:指向 FILE 结构的指针。

函数的返回值是实际读取的数据项数,如果没有读取到任何数据,则返回 0。


使用 fread() 函数时,需要先打开文件(可以使用 fopen() 函数),然后使用 fread() 函数从文件中读取数据。要读取的数据项数是 count,每个数据项的大小是 size。数据读取到缓冲区 ptr 中。


以下是一个例子,从文件中读取 10 个 int 型变量的值:


#include <stdio.h>
#include <stdlib.h>
 
int main() {
   FILE *fp;
   int data[10];
   
   fp = fopen("datafile.bin", "rb");
   if (fp == NULL) {
      printf("Error opening file");
      exit(1);
   }
   
   fread(data, sizeof(int), 10, fp); 
   // 从文件中读取 10 个整数值,每个整数占 4 个字节
 
   fclose(fp);
   
   return 0;
}

8.fwrite

fwrite函数是C/C++中的一个文件写入函数,用于将数据写入文件。


函数的原型如下:

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

参数说明:


  • const void* ptr:指向要写入数据的指针。
  • size_t size:每个数据项的字节大小。
  • size_t count:要写入的数据项数目。
  • FILE* stream:文件指针,指向要写入的文件。

返回值为成功写入的数据项数。


使用示例:


#include <stdio.h>
 
int main() {
    FILE *fp = fopen("test.txt", "w");
    char str[] = "Hello, world!";
    int num = 123;
    fwrite(str, sizeof(char), strlen(str), fp); // 写入字符串
    fwrite(&num, sizeof(int), 1, fp); // 写入整数
    fclose(fp);
    return 0;
}

上述示例中,调用fwrite函数将字符串和整数写入了一个名为test.txt的文件中。注意,fwrite函数是按照二进制方式写入数据的,如果想要按照文本方式写入数据,需要使用fprintf函数。在调用fwrite函数之前,需要通过fopen函数打开文件并获取文件指针。最后,要通过fclose函数关闭文件。

C语言——文件操作(下):https://developer.aliyun.com/article/1515406

相关文章
TU^
|
23天前
|
存储 编译器 C语言
C语言之文件操作
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在⽂件操作结束的时候关闭文件。如果不做,可能导致读写⽂件的问题。
TU^
27 0
|
1天前
|
C语言
【C语言基础】:文件操作详解(后篇)-2
【C语言基础】:文件操作详解(后篇)
|
1天前
|
存储 C语言
【C语言基础】:文件操作详解(后篇)-1
【C语言基础】:文件操作详解(后篇)
|
1天前
|
存储 C语言 C++
【C语言基础】:文件操作详解(前篇:准备知识)
【C语言基础】:文件操作详解(前篇:准备知识)
|
1天前
|
存储 C语言 Windows
C语言——文件操作
C语言——文件操作
|
5天前
|
存储 C语言
C语言进阶 文件操作知识(下)
C语言进阶 文件操作知识(下)
9 2
|
5天前
|
数据库 C语言
C语言进阶 文件操作知识(上)
C语言进阶 文件操作知识(上)
8 3
|
10天前
|
存储 C语言
C语言葵花宝典之——文件操作
C语言葵花宝典之——文件操作
|
12天前
|
存储 编译器 数据库
【再识C进阶5(上)】详细介绍C语言文件操作——文件是用于存储数据
【再识C进阶5(上)】详细介绍C语言文件操作——文件是用于存储数据
|
12天前
|
C语言 C++
22.(C语言)文件操作
22.(C语言)文件操作