震惊!C语言是这样操作文件的!

2024-03-27 16:12
文章标签 语言 操作 震惊

本文主要是介绍震惊!C语言是这样操作文件的!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 文件指针概述
  • 文件指针打开模式
  • 文件常用操作函数
    • fprintf()函数
    • fscanf()函数
    • fgets()函数
    • fputc()函数
    • fgetc()函数
    • feek()函数
    • frewind()函数
  • ⽂件缓冲区

文件指针概述

1,在C语言中,文件指针是一个用于在程序中操作文件的特殊类型指针。文件指针用于跟踪文件中的位置,以便在文件中执行读取和写入操作。

2,常见的文件指针类型是FILE,它是C标准库中定义的一种结构类型。通常,我们使用 FILE* 类型的指针来引用一个文件。

文件指针的主要作用是

1,定位文件位置:文件指针跟踪文件中当前的读/写位置。在文件操作期间,指针会根据读写操作的进行而自动移动到相应的位置。

2,进行文件操作:通过文件指针,可以进行文件的读取、写入和定位等操作。

在文件操作中,文件指针的一般流程是

1,使用fopen()函数打开文件时,该函数返回一个指向文件的指针。

2,通过该指针执行读取和写入操作,例如使用fscanf()、fprintf()等函数。

3,最后使用fclose()函数关闭文件,并释放文件指针所占用的资源。

举个例子:

#include <stdio.h>int main() {FILE *filePointer;   //定义指针,命名char data[100];// 打开文件以供写入filePointer = fopen("example.txt", "w");if (filePointer == NULL) {printf("无法打开文件\n");return 1;}// 写入数据到文件fprintf(filePointer, "Hello, World!\n");fprintf(filePointer, "This is a test message.\n");// 关闭文件fclose(filePointer);// 打开文件以供读取filePointer = fopen("example.txt", "r");if (filePointer == NULL) {printf("无法打开文件\n");return 1;}// 从文件读取数据并打印到控制台while (fgets(data, 100, filePointer) != NULL) {printf("%s", data);}// 关闭文件fclose(filePointer);return 0;
}

文件指针打开模式

打开文件:使用fopen()函数打开文件,语法如下:

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

filename参数是要打开的文件名;

mode参数表示打开文件的模式;
常见的模式有

  • “r”:只读模式,文件必须存在;

  • “w”:写入模式,如果文件存在,则清空文件内容;如果文件不存在,则创建新文件;

  • “a”:追加模式,写入内容追加到文件末尾;如果文件不存在,则创建新文件;

  • “r+”:读写模式,文件必须存在;

  • “w+”:读写模式,如果文件存在,则清空文件内容;如果文件不存在,则创建新文件;

  • “a+”:读写模式,写入内容追加到文件末尾;如果文件不存在,则创建新文件。

  • 读写文件:使用fprintf()和fscanf()函数进行文件的读写操作。例如,使用fprintf()向文件写入数据:

fprintf(FILE *stream, const char *format, ...);
//使用fscanf()从文件读取数据:
fscanf(FILE *stream, const char *format, ...);
//关闭文件:使用fclose()函数关闭文件,释放资源。
int fclose(FILE *stream);
//关闭文件是一个良好的编程习惯,可以避免资源泄漏问题。

文件常用操作函数

fprintf()函数

1,fprintf()函数是C语言中的一个标准输入输出函数,用于将格式化数据写入到文件中。它的原型如下:

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

参数说明

  • stream:指向文件流的指针,指定要写入的目标文件。

  • format:格式化字符串,类似于printf()中的格式化字符串,指定了要写入的内容的格式。

  • …:可变数量的参数,根据format中的格式化要求,提供相应数量的参数。

类比
fprintf()函数的工作方式与printf()类似,但fprintf()将输出结果写入到指定的文件流中,而不是标准输出设备(如屏幕)。它可以用来向文件中写入各种类型的数据,包括字符串、整数、浮点数等。

使用fprintf()函数时,需要注意以下几点:

1,必须先打开文件并创建文件流才能使用fprintf()来写入数据。

2,需要在结束操作后关闭文件流,以确保数据被正确写入文件。

3,格式化字符串中的格式化规范要与提供的参数类型相匹配,否则可能导致不可预料的结果。
示例代码:

#include <stdio.h>int main() {FILE *file = fopen("output.txt", "w"); // 打开一个文件用于写入if (file == NULL) {printf("无法打开文件\n");return 1;}int num = 42;float pi = 3.14159;char str[] = "Hello, World!";// 将数据写入文件fprintf(file, "整数:%d\n", num);fprintf(file, "浮点数:%f\n", pi);fprintf(file, "字符串:%s\n", str);fclose(file); // 关闭文件return 0;
}

fscanf()函数

2,fscanf()函数是C语言中的一个标准输入函数,用于从文件中读取格式化数据。它的原型如下:

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

参数说明

  • stream:指向文件流的指针,指定要读取数据的源文件。
  • format:格式化字符串,类似于scanf()中的格式化字符串,指定了要读取的内容的格式。
  • …:可变数量的参数,根据format中的格式化要求,提供相应数量的指针变量,用于存储读取到的数据。

类比
fscanf()函数的工作方式与scanf()类似,但fscanf()从指定的文件流中读取输入数据,而不是从标准输入设备(如键盘)。它可以用来从文件中读取各种类型的数据,包括整数、浮点数、字符串等。

使用fscanf()函数时,需要注意以下几点:

1,必须先打开文件并创建文件流才能使用fscanf()来读取数据。

2,需要在结束操作后关闭文件流,以确保数据被正确读取。

3,格式化字符串中的格式化规范要与读取的数据类型相匹配,否则可能导致读取错误或未定义行为。

示例代码:

#include <stdio.h>int main() {FILE *file = fopen("input.txt", "r"); // 打开一个文件用于读取if (file == NULL) {printf("无法打开文件\n");return 1;}int num;float pi;char str[50];// 从文件中读取数据fscanf(file, "%d", &num);fscanf(file, "%f", &pi);fscanf(file, "%s", str);printf("整数:%d\n", num);printf("浮点数:%f\n", pi);printf("字符串:%s\n", str);fclose(file); // 关闭文件return 0;
}

fgets()函数

3,fgets()函数是C语言中的一个标准库函数,用于从文件流中读取一行数据。它的原型如下:

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

参数说明

  • str:指向字符数组的指针,用于存储读取到的字符串数据。
  • n:要读取的最大字符数(包括字符串结尾的空字符)。
  • stream:指向文件流的指针,指定要读取数据的源文件。

结束标志

fgets()函数用于从指定的文件流中读取数据,直到遇到换行符(\n)、文件结束符或者读取了n-1个字符为止。它会将读取到的数据存储在指定的字符数组中,并在读取完整行后添加一个空字符来表示字符串的结束。

使用fgets()函数时需要注意以下几点

1,读取的数据会包含换行符\n,除非达到文件末尾。

2,如果成功读取到数据,则fgets()函数会返回第一个参数str的值,如果到达文件末尾或者发生错误,则返回NULL。

3,如果读取的行数据长度超过n-1个字符,fgets()函数会截断多余的部分并在末尾加上空字符。

4,读取到的数据可能不包含换行符,因为fgets()会读取换行符并将其替换为字符串结束符。

示例代码:

#include <stdio.h>int main() {FILE *file = fopen("input.txt", "r"); // 打开一个文件用于读取if (file == NULL) {printf("无法打开文件\n");return 1;}char buffer[100];// 从文件中读取一行数据while (fgets(buffer, sizeof(buffer), file) != NULL) {printf("%s", buffer); // 输出读取到的行数据}fclose(file); // 关闭文件return 0;
}

fputc()函数

4,fputc()函数是C语言中的标准库函数,用于将一个字符写入到指定的文件流中。它的原型如下:

int fputc(int character, FILE *stream);

参数说明

  • character:要写入的字符,通常是一个ASCII码值。
  • stream:指向文件流的指针,指定要写入数据的目标文件。
  • fputc()函数会将指定的字符写入到指定的文件流中,并返回写入的字符(以无符号字符形式)。如果写入成功,则返回写入的字符;如果发生错误,则返回EOF。

使用fputc()函数时需要注意以下几点

1,fputc()函数向文件写入一个字符,如果文件不存在将会新建,如果文件已存在则会覆盖原有内容。

2,如果想连续写入多个字符,可以通过多次调用fputc()函数来实现。
3,写入字符时,会按照ASCII码值写入到文件中。

4,在写入成功后,文件流的位置会自动向前移动一个字符位置。
示例代码:

#include <stdio.h>int main() {FILE *file = fopen("output.txt", "w"); // 打开一个文件用于写入if (file == NULL) {printf("无法打开文件\n");return 1;}char ch = 'A';// 将字符写入文件if (fputc(ch, file) != EOF) {printf("字符'%c'写入成功\n", ch);} else {printf("写入失败\n");}fclose(file); // 关闭文件return 0;
}

fgetc()函数

5,fgetc()函数是C语言中的标准库函数,用于从文件流中读取一个字符。它的原型如下:

int fgetc(FILE *stream);

参数说明

  • stream:指向文件流的指针,指定要从中读取数据的源文件。

    fgetc()函数会从指定的文件流中读取一个字符,并返回读取到的字符(以无符号字符形式)。如果读取成功,则返回读取到的字符;如果已到达文件末尾或者发生错误,则返回EOF。

使用fgetc()函数时需要注意以下几点

1,fgetc()函数每次只能读取一个字符,如果想连续读取多个字符,可以通过多次调用fgetc()函数来实现。
2,每次调用fgetc()函数,文件流的位置会自动向后移动一个字符位置。
3,如果文件流已经到达文件末尾(EOF),则fgetc()函数返回EOF。
4,读取的字符是无符号字符,即在0-255的范围内,EOF的值通常为-1。
示例代码:

#include <stdio.h>int main() {FILE *file = fopen("input.txt", "r"); // 打开一个文件用于读取if (file == NULL) {printf("无法打开文件\n");return 1;}int ch;// 从文件中逐个读取字符while ((ch = fgetc(file)) != EOF) {printf("%c", ch); // 输出读取到的字符}fclose(file); // 关闭文件return 0;
}

feek()函数

6,fseek()函数是C语言中用于设置文件位置指针的函数,它允许我们在文件中移动文件位置指针的位置。fseek()函数的原型如下:

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

参数说明

  • stream:指向文件流的指针,指定要进行定位的文件。

  • offset:偏移量,指定了从起始点(由origin参数确定)开始的偏移量。

  • origin:指定起始点,可以是SEEK_SET、SEEK_CUR或+ SEEK_END,分别表示从文件开头、当前位置或文件末尾开始计算偏移量。

    fseek()函数用于将文件流的位置指针设置到指定的位置。通过调用该函数,可以在文件中进行随机访问,而不仅仅是按顺序读取或写入数据。

示例代码:

#include <stdio.h>int main() {FILE *file = fopen("data.txt", "r"); // 打开文件用于读取if (file == NULL) {printf("无法打开文件\n");return 1;}// 将文件位置指针移动到文件末尾fseek(file, 0, SEEK_END);// 获取当前文件位置指针的位置(即文件末尾的偏移量)long fileSize = ftell(file);printf("文件大小:%ld 字节\n", fileSize);fclose(file); // 关闭文件return 0;
}

frewind()函数

7,frewind()函数是C语言中用于将文件位置指针重新定位到文件的起始位置的函数。它的原型如下:

void rewind(FILE *stream);

参数说明

  • stream:指向文件流的指针,指定要重新定位的文件。

    frewind()函数会将文件位置指针重新设置到文件的起始位置,即相当于调用fseek(stream, 0L, SEEK_SET)来实现。

示例代码:

#include <stdio.h>int main() {FILE *file = fopen("data.txt", "r"); // 打开文件用于读取if (file == NULL) {printf("无法打开文件\n");return 1;}// 将文件位置指针重新设置到文件起始位置rewind(file);// 从文件中读取数据,并进行处理...fclose(file); // 关闭文件return 0;
}

⽂件缓冲区

1,ANSIC标准采⽤“缓冲⽂件系统”处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。

2,从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。

3,如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的⼤⼩根据C编译系统决定的。

这篇关于震惊!C语言是这样操作文件的!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/852688

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

《Java字符串操作之contains和substring方法最佳实践与常见问题》本文给大家详细介绍Java字符串操作之contains和substring方法最佳实践与常见问题,本文结合实例... 目录一、contains 方法详解1. 方法定义与语法2. 底层实现原理3. 使用示例4. 注意事项二、su

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

Java Stream流与使用操作指南

《JavaStream流与使用操作指南》Stream不是数据结构,而是一种高级的数据处理工具,允许你以声明式的方式处理数据集合,类似于SQL语句操作数据库,本文给大家介绍JavaStream流与使用... 目录一、什么是stream流二、创建stream流1.单列集合创建stream流2.双列集合创建str

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.