c语言-文件操作详解(一键三连)

2024-01-06 19:36

本文主要是介绍c语言-文件操作详解(一键三连),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、顺序读写数据文件
        • 1.从键盘输入一些字符,逐个送入磁盘,直到用户输入#结束
        • 2.将一个文件复制到另一个文件
        • 3.从键盘读入若干字符串,按字母排序,之后送到磁盘文件保存
    • 二、用格式化的方式读写文件
        • 1.从键盘输入10个学生的有关数据,然后,转存到磁盘文件
        • 2.

一、顺序读写数据文件

1.从键盘输入一些字符,逐个送入磁盘,直到用户输入#结束

思路:

step1
定义文件指针和字符变量,读入文件,判读是否有该文件。
step2
循环读入字符,并利用fputc(ch,fp),将键盘输入的字符写入磁盘文件,直到输入#结束读入。
step3
关闭文件,向屏幕输出一个换行符,putchar(10);

//10.3 顺序读写数据文件
#include <stdio.h>
#include <stdlib.h> 
int main()
{FILE *fp;char ch,filename[10];printf("请输入所用到的文件名:\n");scanf("%s",filename);if((fp=fopen(filename,"w"))==NULL){printf("无法打开该文件\n");exit(0);}ch=getchar();  //用来接收最后一个输入的回车符 printf("请输入一个准备存储到磁盘的字符串(以#结束)\n");ch=getchar();while(ch!='#'){fputc(ch,fp);putchar(ch);ch=getchar();}fclose(fp); putchar(10); //向屏幕输出一个换行符return 0; 	} 

注意事项:
1.为什么要putchar(10)?

putchar(10)是将一个ASCII码值为10的控制字符输出到屏幕上,它代表了换行符(即Newline字符)。在C语言中,Newline字符用于结束一行文字并移到下一行。当您使用putchar(10)时,可以在屏幕上输出一个换行符,使得后续的输出可以显示在新的一行。这样可以让输出更加清晰易读。

2.ch=getchar(); //用来接收最后一个输入的回车符,这个是接收啥回车符,为什么?

在C语言中,当使用scanf()函数读取输入时,通常会在输入缓冲区中留下一个换行符(即回车符)。这是因为在用户通过键盘输入数据时,通常会在最后按下回车键来确认输入的结束。
例如,如果输入一个字符串并按下回车键,则输入缓冲区中会包含该字符串和一个回车符。当使用getchar()函数读取输入时,它会读取输入缓冲区中的下一个字符,而这个字符就是留在缓冲区中的回车符。
在代码中,通过调用getchar()函数,可以将输入缓冲区中的回车符读取出来并丢弃,从而避免让后续的输入读取到该回车符。这样可以保证程序能够正常地读取后续的输入,并避免潜在的bug。

2.将一个文件复制到另一个文件

step1 读入输入,输出文件的名称,并进行判断是否可读入。
step2 循环直到遇到输入文件的结束标志,循环条件为!feof(in)
step3 循环内部,使用fgetc(in)逐一读取字符,并使用fputc(out),将读取到的字符写入输出文件之中
step4 换行,关闭文件。

#include <stdio.h>
#include <stdlib.h>
int main()
{FILE *in,*out;char ch,infile[10],outfile[10];printf("请输入读入文件的名称\n");scanf("%s",infile);printf("请输入读出文件的名称\n");scanf("%s",outfile);if((in=fopen(infile,"r")) ==NULL){printf("无法打开读入文件\n");exit(0);}if((out=fopen(outfile,"w"))==NULL){printf("无法打开读出文件\n");exit(0);}while(!feof(in)){ch=fgetc(in);fputc(ch,out);putchar(ch);}putchar(10);fclose(in);fclose(out);return 0;} 

注意事项

1.#include <stdlib>是干嘛的?

具体来说,<stdlib.h> 头文件提供了以下功能:
内存管理函数:
malloc(), calloc(), realloc(): 用于动态分配内存。
free(): 用于释放之前分配的内存。
程序终止函数:
exit(): 用于正常或异常终止程序的执行,并返回到操作系统。
字符串转换函数:
atoi(), atol(), atof(): 用于将字符串转换为整数、长整数或浮点数。
伪随机数生成函数:
rand(): 用于生成一个伪随机数。
srand(): 用于设置随机数生成器的种子。
还有其他一些函数和类型定义,例如abs(), labs(), div(), system(), NULL等。
通过包含<stdlib.h>头文件,我们可以在程序中使用这些函数和类型定义,以实现相应的功能。

3.从键盘读入若干字符串,按字母排序,之后送到磁盘文件保存

step1 定义字符串数组,其中str[3][10],定义的是一个可以存放三个字符串的数组,定义零时数组用于后续排序
step2 使用gets,通过for循环输入三个字符串
step3 通过两次循环,进行字符串从小到大排序,外层第一次循环,确定,第一个位置,第一小的字符串,内层循环,用于比较后面的值,找出最小的放到i位置,以此类推
step4 将排好序的字符串进行输入到文集中去。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {FILE *fp;char str[3][10], temp[10];int i, j, k, n = 3;printf("Enter strings:\n");for (i = 0; i < n; i++) gets(str[i]);// 选择法对字符串排序for (i = 0; i < n - 1; i++) {k = i;for (j = i + 1; j < n; j++) {if (strcmp(str[k], str[j]) > 0) k = j;}if (k != i) {strcpy(temp, str[i]);strcpy(str[i], str[k]);strcpy(str[k], temp);}}if ((fp = fopen("string.txt", "w")) == NULL) {printf("can't open file\n");exit(0);}printf("The new sequence:\n");for (i = 0; i < n; i++) {fputs(str[i], fp);fputs("\n", fp);printf("%s\n", str[i]);}fclose(fp);  // 关闭文件return 0;
}

注意事项:

1.str为二维数组,那么str[i]代表第i行,也就是第i行字符串
2.字符串之间的比较使用strcmp(s1,s2),如果s1>s2,那么返回的值>0,比较的方式为逐一比较,ASCII对应的值进行比较。
3.fputs(str,fp)的使用:向文件输入字符串。

二、用格式化的方式读写文件

1.从键盘输入10个学生的有关数据,然后,转存到磁盘文件

step1 定义学生类型结构体,其中包含的成员为学生姓名,学号,年龄,宿舍号
step2 定义保存函数,通过文件指针打开文件,并写入学生信息
step3 再主函数进行输入10个学生的信息,并调用save()函数。

#include <stdio.h>
#define SIZE 10
struct Student_type
{char name[10];int num;int age;char addr[15];
}stud[SIZE];
void save()
{FILE *fp;int i;if((fp=fopen("stu.txt","wb"))==NULL){printf("can't open the file\n");return;}for(i=0;i<SIZE;i++){if(fwrite(&stud[i],sizeof(struct Student_type),1,fp)!=1)printf("file write error\n");}fclose(fp);
}
int main()
{int i;printf("Please enter data of students\n");for(i=0;i<SIZE;i++){scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);}save();return 0;
}

注意事项:

fwrite(&stud[i], sizeof(struct Student_type), 1, fp)

当你调用 fwrite 函数时,它会尝试将数据从内存写入到文件中。让我们来逐步解释一下这行代码:
&stud[i]:表示要写入的数据的起始地址。在这里,&stud[i] 表示第 i 个学生结构体的地址。
sizeof(struct Student_type): 表示要写入的每个数据项的大小。sizeof 运算符用于获取结构体或变量的大小(以字节为单位)。
1: 表示要写入的数据项的数量。在这里,我们每次写入一个 struct Student_type 结构体的数据。
fp: 表示要写入的文件指针,指定了要向哪个文件写入数据。
整个 fwrite 函数的作用是将 sizeof(struct Student_type) 字节大小的 stud[i] 结构体数据写入到文件指针 fp 所指向的文件中。接着,if 语句检查 fwrite 的返回值是否不等于 1。如果 fwrite 返回值不等于 1,那么意味着写入不完整,可能出现了错误。在这种情况下会输出 “file write error” 提示信息。

2.

这篇关于c语言-文件操作详解(一键三连)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

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

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

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

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

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

LabVIEW FIFO详解

在LabVIEW的FPGA开发中,FIFO(先入先出队列)是常用的数据传输机制。通过配置FIFO的属性,工程师可以在FPGA和主机之间,或不同FPGA VIs之间进行高效的数据传输。根据具体需求,FIFO有多种类型与实现方式,包括目标范围内FIFO(Target-Scoped)、DMA FIFO以及点对点流(Peer-to-Peer)。 FIFO类型 **目标范围FIFO(Target-Sc

019、JOptionPane类的常用静态方法详解

目录 JOptionPane类的常用静态方法详解 1. showInputDialog()方法 1.1基本用法 1.2带有默认值的输入框 1.3带有选项的输入对话框 1.4自定义图标的输入对话框 2. showConfirmDialog()方法 2.1基本用法 2.2自定义按钮和图标 2.3带有自定义组件的确认对话框 3. showMessageDialog()方法 3.1