首页 > 其他分享 >九、文件操作

九、文件操作

时间:2024-03-24 15:55:05浏览次数:32  
标签:fp 文件 函数 int 写入 操作 读取

本章专题脉络

image

1、文件和流的介绍

文件,对我们并不陌生,文件是数据源(保存数据的地方)的一种,比如大家经常使用的word文档,txt文件,excel文件,avi文件...都是文件。文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保持视频,声音...

C程序中,对于文件中数据的输入/输出操作以“流(stream)” 的方式进行,可以看做是一种数据的流动。

image

输入流:数据从数据源(比如:文件)到程序(或内存)的流动过程。

输出流:数据从程序(或内存)到数据源(比如:文件)的流动过程。

image

2、C 输入 & 输出

  • 当我们提到输入时,这意味着要向程序(或内存)中写入一些数据。输入的数据来源可以是从键盘中、从文件中或从网络中。C 语言提供了一系列内置的函数来读取给定的输入,并根据需要写入到程序中。

  • 当我们提到输出时,这意味着要在屏幕上、打印机上或任意文件中显示(或保存)一些数据。同样,C 语言提供了一系列内置的函数来输出数据到指定的载体上。

2.1 标准文件I/O

C 语言把所有的设备都当作文件。所以设备(比如显示器)被处理的方式与文件相同。以下三个文件会在程序执行时自动打开,以便访问键盘和屏幕。

标准文件 文件指针 设备
标准输入 stdin 键盘
标准输出 stdout 屏幕
标准错误 stderr 屏幕

文件指针是访问文件的方式,我们会讲解如何从屏幕读取值以及如何把结果输出到屏幕上。

2.2 scanf()和printf()函数

C 语言中的 I/O (输入/输出)通常使用printf()scanf() 两个函数。

  • int scanf(const char *format, ...) 函数从标准输入流 stdin 读取输入,并根据提供的 format 来浏览输入。
  • int printf(const char *format, ...) 函数把输出写入到标准输出流 stdout ,并根据提供的格式产生输出。

其中,format 可以是一个简单的常量字符串,但是您可以分别指定 %s、%d、%c、%f 等来输出或读取字符串、整数、字符或浮点数。如需了解完整的细节,可以查看这些函数的参考手册。

举例1:将内容输出到屏幕

#include <stdio.h>	// 执行printf() 函数需要该库

int main(){
    printf("hello"); //显示引号中的内容
    return 0;
}

举例2:

#include <stdio.h>

int main( ) {

  char str[100];
  int i;

  printf( "Enter a value :");
  scanf("%s %d", str, &i);

  printf( "\nYou entered: %s %d ", str, i);
  printf("\n");
  
  return 0;
}

2.3 getchar()和putchar() 函数

  • int getchar(void) 函数从屏幕读取下一个可用的字符,并把它返回为一个整数。这个函数在同一个时间内只会读取一个单一的字符。您可以在循环内使用这个方法,以便从屏幕上读取多个字符。

  • int putchar(int c)函数把字符输出到屏幕上,并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。您可以在循环内使用这个方法,以便在屏幕上输出多个字符。

举例:程序会读取一个单一的字符

#include <stdio.h> 

int main( ){
    int c;
    printf( "Enter a value :"); 
    c = getchar();
    
    printf( "\nYou entered: ");
    putchar(c);
    printf("\n");

    return 0;
}

2.4 gets()和puts() 函数

  • char *gets(char *s) 函数从stdin读取一行到 s 所指向的缓冲区,直到一个终止符或EOF。

  • int puts(const char *s) 函数把字符串s 和一个尾随的换行符写入到stdout。

举例:程序读取一整行直到该行结束。

#include <stdio.h>

int main( ){
    char str[100];
    
    printf( "Enter a value :"); 
    gets(str);
    
    printf( "\nYou entered: "); 
	puts( str );

    return 0;
}

3、C 文件的读写

一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节。C 语言不仅提供了访问顶层的函数,也提供了底层调用来处理存储设备上的文件。

3.1 创建/打开文件

使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE 包含了所有用来控制流的必要的信息。

函数原型:

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

说明:在这里,filename是字符串,用来命名文件;访问模式mode的值可以是下列值中的一个。

第1波:

模 式 描 述
r 只读。打开一个已有的文本文件,只允许读取。
w 只写。打开一个文本文件,只允许写入文件。如果文件不存在,则会创建一个新文件,
并从文件的开头写入内容。如果文件存在,则截断文件为零长度,从开始写入!
a 追加。打开一个文本文件,用于写入。如果文件不存在,则创建一个新文件。
如果文件已存在,则将写入的数据追加到文件末尾。
rb 只读(二进制)。打开一个二进制文件,只允许读取。
wb 只写(二进制)。打开一个二进制文件,只允许写入。如果文件不存在,则创建一个
新文件。如果文件已存在,则截断文件为零长度,从开始写入!
ab 追加(二进制)。打开一个二进制文件,用于写入。如果文件不存在,则创建一个
新文件。如果文件已存在,则将写入的数据追加到文件末尾。

第2波:

模 式 描 述
r+ 读写。打开一个文本文件,允许读取和写入。
w+ 读写。打开一个文本文件,允许读取和写入。如果文件不存在,则创建一个新文件。
如果文件已存在,则截断文件为零长度,从开始写入!
a+ 读写。打开一个文本文件,允许读取和写入。如果文件不存在,则创建一个新文件。
如果文件已存在,则将写入的数据追加到文件末尾。
r+b "rb+"读写(二进制)。打开一个二进制文件,允许读取和写入。
w+b "wb+"读写(二进制)。打开一个二进制文件,允许读取和写入。如果文件
不存在,则创建一个新文件。如果文件已存在,则截断文件为零长度。
a+b "ab+"读写(二进制)。打开一个二进制文件,允许读取和写入。如果文件
不存在,则创建一个新文件。如果文件已存在,则将写入的数据追加到文件末尾。

技巧:这些访问模式字符串可以根据需要进行组合使用。例如,"r+" 表示读写,"r+b" 表示读写(二进制)。

注意:如果处理的是二进制文件(图片,视频..),则需使用下面的访问模式: "rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b" 。

3.2 关闭文件

使用完文件后(读,写),一定要将该文件关闭。

关闭文件,使用fclose( ) 函数。

函数原型:

int fclose( FILE *fp );
  • 如果成功关闭文件,fclose( ) 函数返回零。此时,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。
  • 如果关闭文件时发生错误,函数返回 EOF。EOF 是一个定义在头文件 stdio.h 中的常量。

3.3 写入文件

C 标准库提供了各种函数来按字符或者以固定长度字符串的形式读/写文件。

1)fputc 函数

函数原型:

int fputc( int c, FILE *fp );

说明:

函数 fputc() 把参数c 的字符值写入到fp 所指向的输出流中。如果写入成功, 它会返回写入的字符,如果发生错误,则会返回 EOF。

2)fputs 函数

函数原型:

int fputs( const char *s, FILE *fp );

说明:

函数fputs() 把字符串 s 写入到 fp 所指向的输出流中。如果写入成功,它会返回一个非负值,如果发生错误,则会返回 EOF。

3)fprintf 函数

函数原型:

int fprintf(FILE *fp,cons t char *format, ...);

功能与fputs()类似,将一个字符串写入到文件中。

举例:

#include <stdio.h>

int main() {

    //创建一个文件指针
    FILE *fp = NULL;

    //打开该文件
    fp = fopen("d:/hello.txt", "w+"); //w+模式是:如果文件已存在,则截断文件为零长度。
    //fp = fopen("d:/hello.txt", "a+"); //a+模式是:如果文件已存在,则将写入的数据追加到文件末尾。

    //将内容写入到文件中
    fputs("你好,北京!!\n", fp);
    fprintf(fp, "你好,世界!!\n");

    //关闭文件!如果不关闭 ,我们的内容没有保存到文件中!
    fclose(fp);

    printf("创建,写入信息完成");

    return 0;
}

3.4 读取文件

1)fgetc 函数

函数原型:

int fgetc( FILE * fp );

说明:

fgetc() 函数从fp 所指向的输入文件中读取一个字符。返回值是读取的字符, 如果发生错误则返回 EOF。

2)fscanf 函数

函数原型:

int fscanf(FILE *fp, const char *format, ...)

说明:

使用 fscanf() 函数从文件中读取格式化的数据,比如整数、浮点数等各种类型的数据format 参数指定了数据的格式,后面的参数是用于存储读取数据的变量。

如果使用 fscanf() 函数从文件中读取字符串,会在遇到第一个空白字符(空格、制表符、换行符等)时,停止读取,之后的内容会被忽略。

如果函数成功读取了一些数据并按照指定格式存储到相应的变量中,它会返回成功读取的参数个数。或者在读取失败或文件结束时返回 EOF。

3)fgets 函数

函数原型:

char *fgets( char *buf, int n, FILE *fp );

说明:

此函数按行读取数据,它从文件中读取一行数据(包括换行符 '\n'),并将这一行的内容存储到指定的缓冲区中。参数中 buf 是用于存储读取的文本的缓冲区,n 是缓冲区的大小,fp 是文件指针。

如果成功读取,返回参数 buf,即读取到的字符串的首地址。如果到达文件末尾或者读取失败,返回NULL。

举例:

#include <stdio.h>

int main() {

    //创建一个文件指针
    FILE *fp = NULL;
    //定义一个缓冲区
    char buff[1024];

    //打开文件
    fp = fopen("d:/hell.txt", "r");
    //方法1
    //fscanf(fp, "%s", buff);
    ////输出
    //printf("%s\n", buff);

    //方法2 读取整个文件
    //说明,循环读取fp指向的文件内容,如果读到NULL,就结束

    while (fgets(buff, 1024, fp) != NULL) {
        printf("%s", buff);
    }

    //关闭文件
    fclose(fp);

    return 0;
}

标签:fp,文件,函数,int,写入,操作,读取
From: https://www.cnblogs.com/luzriu/p/18092534

相关文章

  • 基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
    1.算法运行效果图预览RTL图:   仿真图:   导入到matlab显示效果如下:   2.算法运行软件版本matlab2022a vivado2019.2 3.算法理论概述      在计算机视觉领域,基于肤色模型和中值滤波的手部检测方法是一种常见的初步定位策略。该方法主要分为......
  • 一个操作让数组处理速度快了5倍,到底是为什么
     概述:通过对数组进行排序,代码更好地利用了缓存,从而提高了程序的性能。这种现象通常被称为"缓存友好"(cache-friendly)或"空间局部性"(spatiallocality)今天做一个数组数据计算时,发现一个效率问题,给大家分享一下一个数组排序和不排序时同样的逻辑处理速度是不一样的。排序后速度......
  • C++共享之道:用extern实现源文件变量与类成员函数的巧妙共享
    概述:在C++中,使用`extern`关键字可实现在源文件之间共享变量与类成员函数。通过声明变量或类在头文件中,再在一个源文件中定义,其他源文件通过`extern`引用,促使模块化、可维护的代码组织。在C++中,extern关键字可用于在源文件之间共享变量。它告诉编译器某个变量的声明在其他源文......
  • Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向
    Java基础什么是JavaJava是一种由SunMicrosystems于1995年首次发布的编程语言和计算平台。Java是一种通用的、基于类的、面向对象的编程语言,旨在减少实现依赖性。它是一个应用程序开发的计算平台。Java快速、安全、可靠,因此在笔记本电脑、数据中心、游戏机、科学超级计......
  • CS 550操作系统
    CS550操作系统,2024年春季编程项目2(PROJ2)输出:2024年2月25日,SUN截止日期:2024年3月23日,SAT23:59:59这个项目有两个部分:编码和问答。在编码部分,您将实现在xv6中分叉后更改竞赛条件结果的功能,并实现xv6的类似MLFQ的调度器。在问答部分,您需要回答有关xv6的问题过程调度。1基线源代码......
  • Redis中AOF文件重写与同步
    AOF文件的写入与同步Redis服务器进程就是一个时间循环(loop),这个循环中的文件时间负责接收客户端的命令请求,以及向客户端发送命令回复,而时间事件则负责执行像serverCron函数这样需要定时运行的函数。因为服务器在处理文件事件时可能会执行些命令,使得一些内容被追加到aof_b......
  • matlab批量读取目录下的文件的方法
    批量处理可以提高效率,这里提供一个可以批量读取nc文件的代码:address='C:\Users\HelloWorld!!\DESKTOP\TerraClimate_ppt\';%Getthelistoffilesudir=address;form='*.nc';%Getthelistofstationnamesfiles=GetFiles(udir,form); [n,p]=size(files......
  • 电脑数据安全新利器:自动备份文件的重要性与实用方案
    一、数据安全的守护神:自动备份文件的重要性在数字化时代,电脑中的文件承载着我们的工作成果、个人回忆以及众多重要信息。然而,数据丢失的风险无处不在,无论是硬件故障、软件崩溃,还是恶意软件的攻击,都可能让我们的文件面临灭顶之灾。因此,自动备份文件的重要性愈发凸显。电......
  • 文件夹秒变文件?别慌,这里有恢复秘籍!
    近日,许多用户反映电脑中的文件夹突然变成了文件,使得原本井井有条的文件结构变得一团糟。这些“变异”的文件夹不仅无法正常打开,还可能导致其中的数据丢失,给用户带来了极大的困扰。那么,究竟是什么原因导致了文件夹变成文件呢?又该如何恢复这些丢失的数据呢?接下来,就让我们一起探讨......
  • nginx挂载配置文件和日志-静态目录-方式二
    环境说明linux系统版本:lsb_release-a docker版本:docker-v Nginx镜像版本:1.24.0 不同的操作系统以及软件版本,可能会遇到不一样的问题,一定要注意版本问题。 .1.创建需要挂载的文件目录,比如html和log,还有配置文件nginx.conf.自己首先创建一个目录,结构如下。 ......