震惊!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

相关文章

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage