C语言由浅入深讲解文件的操作下篇

目录
  • 文件的顺序读写
    • 字符输入输出fgetc和fputc
    • 文本行输入输出函数fgets和fputs
    • 格式化输入输出函数fscanf和fprintf
    • 二进制输入输出函数fread和fwrite
  • 文件的随机读写
    • fseek
    • ftell
    • fwind
  • 文本文件和二进制文件
  • 文件结束的判定
    • feof
  • 文件缓冲区

第一篇讲了文件的基本概念,和文件如何打开和关闭。第二篇主要介绍文件的顺序读写和随机读写。外加文件缓冲区的知识点。

文件的顺序读写

字符输入输出fgetc和fputc

fgetc:字符输入函数,也就是读文件时用的函数。

函数功能:Read a character from a stream

从一个文件中读一个字符到内存中。

函数原型:

int fgetc( FILE *stream );

参数为stream,也就是文件指针。

返回值:fgetc return the character read as an int or return EOF to indicate an error or end of file.该函数调用成功会返回读取到的的字符的ASCIIC码值;若读取文件时发生错误,或是已经读取到文件末尾,则返回EOF。

举例:将data.txt文件中的内容读取,并打印。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
	//打开文件
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;//文件打开失败,失败返回
	}
	//对文件进行输入字符操作
	int ch = 0;
	while ((ch = fgetc(pf))!= EOF)
	{
		printf("%c", ch);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

fputc:

函数功能:从内存中写一个字符到文件中。也就是输出字符。

函数原型:

int fputc( int c, FILE *stream );

第一个参数为待输出的字符,第二个参数是文件指针。

返回值:Each of these functions returns the character written. For fputc , a return value of EOF indicates an error.

如果正常运行则返回此字符,如果返回EOF则意味着失败。

举例:将字母a~z写入到data.txt文件中

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
	//打开文件
	FILE* pf = fopen("data.txt", "w");
	//文件打开失败,失败返回
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//对文件进行输出字符的操作
	char i = 0;
	for (i = 'a'; i <= 'z'; i++)
	{
		fputc(i, pf);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

文本行输入输出函数fgets和fputs

fgets和fputs是对文本行的操作,相当于对字符串的操作。这是不同于fgetc和fputc的地方。

fgets:

函数功能:

从文件中读一行字符到内存中,也就是输入。

函数原型:

char *fgets( char *string, int n, FILE *stream );

第一个参数是指向文件字符串的指针,第二个参数是读几个字符的意思,第三个参数是指向文件的指针。

返回值:Each of these functions returns string. NULL is returned to indicate an error or an end-of-file condition. Use feof or ferror to determine whether an error occurred.每一个这样的函数结束后正常情况返回一个指向这个字符串的字符指针。如果返回NULL则意味着遇到错误,或者是文件结束。但是重点来了~,想要判断到底是错误导致的返回,还是文件结束导致的返回,还需要使用feof函数和ferror函数来判断。

下面有涉及feof函数的用法

举个例子。

   //feof是用来在结束后判断是什么原因结束的
    if (ferror(fp))
        puts("I/O error when reading");
    else if (feof(fp))
        puts("End of file reached successfully");
    fclose(fp);
}

注意:

1.在fgets函数读取到指定字符数之前,若读取到换行符(’\n’),则停止读取,读取带回的字符包含换行符。

2. fgets函数读取到第n-1个字符时都没有遇到换行符(’\n’)时,则返回读到的前n-1个字符,并在末尾加上一个NULL字符返回。这样加起来共n个字符

fputs函数:

函数功能:

写一行字符串到文件中,也就是输出。

函数原型:

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

第一个参数为指向内存中这个字符串的指针,第二个参数为指向这个文件的文件指针。返回值:该函数调用成功会返回一个非负值;若输出时发生错误,则返回EOF。

格式化输入输出函数fscanf和fprintf

fscanf和fprintf也叫格式化输入(读)和输出(写)函数。

fscanf:

函数功能:

按照一定的格式如%s,%c,从指定文件的位置输入到内存中。

函数原型:

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

fscanf函数的第一个参数是读取数据的位置也就是文件指针,第二个参数也就是scanf函数的参数,也就是取地址。

除了第一个参数是需要指针位置其余和scanf函数操作一样。

fprintf:

函数功能:

将内存中的数据以一定的格式输出到文件中。也就是打印,也称为写。

函数原型:

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

第一个参数是文件指针,第二个参数和printf函数一样,会用printf函数就会用这个函数。

举例:

include <stdio.h>
#include <string.h>
#include <errno.h>
struct S
{
	char name[20];
	char sex[5];
	int age;
};
int main()
{
	//打开文件
	FILE* pf = fopen("data.txt", "r");
	//如果文件打开失败,失败返回
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//对文件进行格式化输入输出操作
	struct S tmp = { 0 };
	fscanf(pf, "%s %s %d", tmp.name, tmp.sex, &(tmp.age));
	printf("%s %s %d\n", tmp.name, tmp.sex, tmp.age);
	//可以打印出来,我这里没打印。
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

二进制输入输出函数fread和fwrite

函数功能:Reads data from a stream.从一个流中读取数据到内存中。

函数原型:

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

第一个参数是buffer是内存的意思,第二个参数是要读的数据的类型,第三个参数是读取的个数,第四个参数是文件指针。总的意思是从文件指针指向的文件读取count个size大小的数据到内存buffer中。

返回值:若在读取过程中发生错误或是在未读取到指定元素个数时读取到文件末尾,则返回一个小于count的数。

fwrite:

函数功能:Writes data to a stream.写入二进制数据到文件中

函数原型:

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

第一个参数是输出数据的位置,第二个参数是要输出数据的元素个数,第三个参数是每个元素的大小,第四个参数是数据输出的目标位置。返回值:该函数调用完后,会返回实际写入目标位置的元素个数,当输出时发生错误或是待输出数据元素个数小于要求输出的元素个数时,会返回一个小于count的数。

举例:以wb输出到文件

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
	//打开文件
	FILE* pf = fopen("data.txt", "wb");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//对文件以二进制形式进行输出操作
	int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	fwrite(arr, sizeof(int), 10, pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

文件的随机读写

fseek

函数介绍:

定位文件指针,以文件指针当前的位置,偏移到想定位的位置。向前偏移是负的,比如-1,-2,向后偏移是正的。

  • SEEK_CUR:从当前指针的位置偏移
  • SEEK_SET:从文件的起始位置开始偏移
  • SEEK_END:从文件的末尾开始偏移

函数原型:

int fseek( FILE *stream, long offset, int origin );

第一个参数是文件指针,第二个参数是要偏移的偏移量。第三个参数是从什么位置开始偏移。举例。

/* fseek example */
#include <stdio.h>
int main ()
{
  FILE * pFile;
  //打开文件
  pFile = fopen ( "example.txt" , "wb" );
  //以一行的形式写文件
  fputs ( "This is an apple." , pFile );
  //让文件指针从文件的起始位置开始偏移9个单位。
  fseek ( pFile , 9 , SEEK_SET );
  //继续写文件
  fputs ( " sam" , pFile );
  //关闭文件
  fclose ( pFile );
  return 0;
  }

ftell

函数介绍:

可以返回文件指针相对于起始位置的偏移量

函数原型:

long ftell( FILE *stream );

返回值类型为long int,第一个参数是文件指针。

fwind

函数介绍

让文件指针回到文件的起始位置。fseek函数也可以达到同样的效果。

函数原型:

void rewind( FILE *stream );

举例

/* rewind example */
#include <stdio.h>
int main ()
{
  int n;
  FILE * pFile;
  char buffer [27];
  //打开文件
  pFile = fopen ("myfile.txt","w+");
  for ( n='A' ; n<='Z' ; n++)
   {
   	 fputc ( n, pFile);
   }
  //使指针回到起始位置
  rewind (pFile);
  fread (buffer,1,26,pFile);
  fclose (pFile);
  buffer[26]='\0';
  puts (buffer);
    return 0;
   }

文本文件和二进制文件

数据文件:可以分为文本文件和二进制文件

二进制文件:文本文件可以肉眼看懂,二进制文件则是乱码看不懂。

数据在内存中是以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件文本文件:如果要求在外存中以ASCII码的形式存储,则需要在存储前转换。如果以ASCII字符的形式存储文件就叫做文本文件。

具体例子如下。

一个数据在内存中是怎么存储的呢?

如果整数10000以ASCII码的形式输出到磁盘,则占用5个字节。如果以二进制形式输出到磁盘则占用4个字节。

文件结束的判定

feof

牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件是否结束。

函数功能:

应用于当文件读取结束的时候,用ferror判断是读取失败结束,还是遇到文件末尾结束。

1.文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者是否为NULL(fgets)等。每个函数有每个特定的结束标志。

2.二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

正确使用例子

#include <stdio.h>
#include <stdlib.h>
int main(void) {
    int c;
     // 注意:int,非char,要求处理EOF
    FILE* fp = fopen("test.txt", "r");
    //如果为0,则打开失败
    if(!fp)
    {
        perror("File opening failed");
        return EXIT_FAILURE;
   }
 //fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
    while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环
   {
       putchar(c);
   }
   //feof是用来在结束后判断是什么原因结束的
    if (ferror(fp))
        puts("I/O error when reading");
    else if (feof(fp))
        puts("End of file reached successfully");
    fclose(fp);
}

文件缓冲区

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

举例:C语言代码也就是用户程序,要在屏幕上打印信息。则需要调用printf函数,而printf函数则调用了系统的API,让操作系统在屏幕上打印信息。但操作系统要为好多程序服务。所以在操作系统解决前,先放到文件缓冲区,程序攒满了再交给操作系统解决。

结论:因为有缓冲区的存在,C语言再操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做,可能导致读写文件的问题

到此这篇关于C语言由浅入深讲解文件的操作下篇的文章就介绍到这了,更多相关C语言 文件操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解C语言之文件操作下)

    目录 文件的随机读写 fseek函数 ftell函数 rewind函数 文件结束判定 feof函数和ferror函数 总结 文件的随机读写 之前的函数只能实现顺序读写,而实现随机读写需用fseek函数来定位--根据文件指针的位置和偏移量来定位文件指针 fseek函数 int fseek(FILE* stream, long int offset, int origin); 返回值:若成功返回0,则返回非0值. 参数:stream为文件指针,offset为偏移量.origin为起始位置,有三种 S

  • 详解C语言之文件操作(上)

    目录 什么是文件 程序文件 数据文件 文件名 文件类型 文件缓冲区 文件指针 文件的打开和关闭 输入和输出 总结 什么是文件 磁盘上的文件就是文件. 在程序设计中,我们一般谈的文件有两种:程序文件和数据文件 程序文件 包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe). 数据文件 文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行时需要从中读取数据的文件,或者输出内容的文件. 文件名 文件名包含三部分:文件路径.

  • C语言超详细文件操作基础上篇

    目录 一.为什么使用文件 二.什么是文件 1.什么是数据文件 2.什么是程序文件 3.文件名 三.文件的打开和关闭 1文件指针: 2.打开和关闭文件函数 (1)打开文件函数: (2)关闭文件函数 四.文件的顺序读写 1.写文件(fputc,操作一个字符) 2.读文件(fgetc,操作一个字符) 3.写文件(fputs,操作字符串) 4.读文件(fgets,操作字符串) 一.为什么使用文件 为了更好的把信息记录下来,对数据进行持久化的保存,这个时候我们就可以把数据写到文件里面去,使用文件我们可以将

  • 一篇文章带你了解C语言的文件操作

    目录 为什么使用文件 什么是文件 程序文件 数据文件 文件名 文件的打开和关闭 文件指针 fopen和fclose函数 文件的顺序读写 总结 为什么使用文件 我们在想既然是通讯录就应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在.这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件.存放到数据库等方式.使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化. 什么是文件 磁盘上的文件是文件.但是在程序设计中,我们一般谈的文件有两种:程序文件.

  • C语言进阶之文件操作详解

    目录 0.Intro 1.文件名 2.文件的打开和关闭 2.1文件指针 2.2打开和关闭文件 3.文件顺序读写 3.1利用以上函数实现拷贝文件操作 3.2二进制的读写 3.3格式化输入输出函数 4.文件的随机读写操作 4.1fseek 4.2ftell 4.3rewind 5.文本文件和二进制文件 5.1一个数据在内存中的存储方式 6.文件读取错误的判定 6.1被错误使用的feof 7.文件缓冲区 7.1行缓冲 总结 0. Intro 在使用操作数据库之前,记录信息,录入数据需要文件操作,这样就

  • C语言常见的文件操作函数

    目录 一.文件的打开和关闭 1.文件指针 2.文件打开和关闭 二.文件的顺序读写 1.fgetc()和fputc()函数 2.fgets()和fputs()函数 3.fscanf()和fprintf()函数 4.fread()和fwrite()函数 三.文件的随机读写 1.fseek函数 2.ftell函数 3.rewind函数 四.文本文件和二进制文件 五.文件读取结束的判定 六.文件缓冲区 总结 一.文件的打开和关闭 1.文件指针 每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存

  • C语言超详细文件操作基础下篇

    目录 一.文件的顺序读写 1.格式化的输出函数(fprintf) 2.格式化的输入函数(fscanf) 3.二进制读写 1.二进制输出函数(fwrite) 2.二进制输入函数 3.scanf,fscanf,sscanf.printf,fprintf,sprintf的区别 二.文件的随机读写 1.fseek函数 2.ftell函数 3.rewind函数 三.被错误使用的feof 总结 一.文件的顺序读写 兄弟们,上一章只介绍到了如何把单个的字符或者字符串如何写到文件里或者从文件中读取,文件的顺序读

  • C语言由浅入深讲解文件的操作下篇

    目录 文件的顺序读写 字符输入输出fgetc和fputc 文本行输入输出函数fgets和fputs 格式化输入输出函数fscanf和fprintf 二进制输入输出函数fread和fwrite 文件的随机读写 fseek ftell fwind 文本文件和二进制文件 文件结束的判定 feof 文件缓冲区 第一篇讲了文件的基本概念,和文件如何打开和关闭.第二篇主要介绍文件的顺序读写和随机读写.外加文件缓冲区的知识点. 文件的顺序读写 字符输入输出fgetc和fputc fgetc:字符输入函数,也就

  • C语言由浅入深讲解文件的操作上篇

    目录 为什么使用文件 什么是文件 文件名 关于文件的一些概念 文件函数 fopen fclose 实例代码 绝对路径 文件的打开方式 文件操作流程 为什么使用文件 前面写的通讯录,增加人数退出程序后,数据就会消失.此时数据是存放在内存中,下次运行通讯录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受. 所以文件操作就应运而生.数据持久化的方法有两种:1.把数据存放在磁盘文件2.存放到数据库使用文件我们们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化. 什么是文件 但是在程序设计中

  • C语言超详细讲解文件的操作

    目录 一.为什么使用文件 二.什么是文件 1.程序文件 2.数据文件 3.文件名 三.文件指针 四.文件的打开和关闭 五.文件的顺序读写 六.文件的随机读写 fseek ftell rewind 七.文件结束判定 一.为什么使用文件 当我们写一些项目的时候,我们应该要把写的数据存储起来.只有我们自己选择删除数据的时候,数据才不复存在.这就涉及到了数据的持久化的问题,为我们一般数据持久化的方法有,把数据存在磁盘文件.存放到数据库等方式.使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久

  • C语言由浅入深讲解线程的定义

    目录 线程的概念 线程的创建 线程的终止 线程标识的比较 线程的取消 线程等待 线程分离 线程的概念 可以简单理解为一个正在独立运行的函数 注: 1.posix线程是一套标准吗,而不是实现 2.线程标识: phread_t,可能是整形也可能是结构体指针等 *简单介绍关于线程标识的函数* *pthread_equarl() ;判断两个线程标识是否相等**pthread_self():返回自身的线程标识* 线程的创建 pthread_creat(); int pthread_create( pthr

  • 一文带你掌握Go语言中的文件读取操作

    目录 os 包 和 bufio 包 os.Open 与 os.OpenFile 以及 File.Read 读取文件操作 bufio.NewReader 和 Reader.ReadString 读取文件操作 小结 os 包 和 bufio 包 Go 标准库的 os 包,为我们提供很多操作文件的函数,如 Open(name) 打开文件.Create(name) 创建文件等函数,与之对应的是 bufio 包,os 包是直接对磁盘进行操作的,而 bufio 包则是带有缓冲的操作,不用每次都去操作磁盘.

  • C#实现ini文件读写操作

    本文实例为大家分享了C#语言实现ini文件读写操作的具体代码,供大家参考,具体内容如下 1.ini文件是什么? 见百度百科 2.C#语言实现ini文件的读写操作 /// <summary> /// 配置文件 .ini操作类 /// </summary> public class IniFileUtils { /// <summary> /// 写入INI文件 /// </summary> /// <param name="section&qu

  • R语言对CSV文件操作实例讲解

    在 R 语言中,我们可以从存储在 R 语言环境外的文件中读取数据. 我们还可以将数据写入将被操作系统存储和访问的文件. R 语言可以读取和写入各种文件格式,如​csv​,​excel​,​xml​等. 在本章中,我们将学习从​csv​文件读取数据,然后将数据写入​csv​文件. 该文件应该存在于当前工作目录中,以便 R 语言可以读取它. 当然我们也可以设置我们自己的目录并从那里读取文件. 获取和设置工作目录 您可以使用​getwd()​函数检查R语言工作区指向的目录. 您还可以使用​setwd(

  • C语言全面细致讲解文件操作

    目录 什么是文件 程序文件 数据文件 文件名 文件指针 文件的打开和关闭 文件的顺序读写 字符输入输出函数 字符串输入输出函数(fgets,fputs) 格式化输入输出函数(fscanf,fprintf) 二进制输入输出函数(fread,fwrite) 文件的随机读写 fseek ftell 文件读取结束的判定 什么是文件 磁盘上的文件是文件.但是在程序设计中,我们一般谈的文件有两种:程序文件.数据文件(从文件功能的角度来分类的). 程序文件 包括源程序文件(后缀为.c),目标文件(window

  • 易语言复制文件的操作步骤

    自从接触了计算机和Windows操作系统,我们也就慢慢接触到了复制和粘贴,相信CTRL+C 这组快捷键的使用频率不会低,今天,MovieClip给大家讲解,易语言怎么复制文件,好了,开始学习吧! 易语言怎么复制文件 依旧是运行易语言程序,新建Windows窗口程序,点击确定进入开发环境.如图: 在窗口上绘制标签组件.编辑框组件.按钮组件.拖放控件各一个,调整好组件的位置和尺寸.如图: 修改相应组件的相关属性,比如标题.规范命名各组件的名称,以方便后续的代码编写.如图: 进入代码编写阶段,具体代码

随机推荐