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

相关文章

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上

动手学深度学习【数据操作+数据预处理】

import osos.makedirs(os.path.join('.', 'data'), exist_ok=True)data_file = os.path.join('.', 'data', 'house_tiny.csv')with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA