C语言的文件操作_C语言调用文件

C语言的文件操作_C语言调用文件文件打开与关闭C文件操作用库函数实现,包含在stdio.h中。文件使用方式:打开文件→文件读/写→关闭文件系统自动打开和关闭三个标准文件:标准输入——键盘 stdin标准输出——显示器 stdout标准出错输出—–显示器 stderr文件读写操作当我们把文件打开之后,就可以对它进行读与…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

文件打开与关闭

C文件操作用库函数实现,包含在stdio.h中。
文件使用方式:
打开文件→文件读/写→关闭文件

系统自动打开和关闭三个标准文件:
标准输入——键盘 stdin
标准输出——显示器 stdout
标准出错输出—–显示器 stderr
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

文件读写操作

当我们把文件打开之后,就可以对它进行读与写的操作。
读/写文件中的一个字符

在这里插入图片描述
文件I/O与终端I/O的关系
在这里插入图片描述
案例:
例如:从键盘输入字符,逐个写入文件,直到输入一个“#”为止。

#include <stdio.h>
int main(void)
{ 
   	
	FILE *fp = NULL;
	char ch;
	fopen_s(&fp, "D:\\text.txt", "w");
	if (fp == NULL)
	{ 
   
		exit(0);
	}
	else	
	{ 
   	
		ch = getchar();
		while (ch != '#')
		{ 
   	fputc(ch, fp);  
			//字符被写入filename表示的文件中
			putchar(ch);   
			//字符被输出到显示器
			ch = getchar();
		}
		putchar(10);     // 向屏幕输出一个换行符
		fclose(fp);
	}  
	return 0;
}
 	

例如:将一个磁盘文件中的信息复制到另一个磁盘文件中。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{ 
   
	FILE *in, *out;
	char ch;
	if ((fopen_s(&in,"D:\\dd.txt", "r")) != 0)
	{ 
   
		printf("Cannot open infile.\n"); 
		exit(0);
	}
	if ((fopen_s(&out,"D:\\ee.txt", "w")) != 0)
	{ 
   
		printf("Cannot open outfile.\n"); 
		exit(0);
	}
	while (!feof(in))
		fputc(fgetc(in), out);

	fclose(in);   
	fclose(out);

	return 0;
}

读/写文件中的字符串

在这里插入图片描述

数据块输入输出函数:fread与fwrite
一般调用形式:
fread(buffer,size,count,fp );
fwrite(buffer,size,count,fp );
参数说明:
buffer: 要读入的数据块的存放首地址或要输出的数据块的起始地址。
size: 每个要读/写的数据块的大小(字节数)
count: 要读/写的数据块的个数
fp: 要读/写的文件指针
返回值:
成功,返count的值;出错或文件尾,0值。
fread与fwrite 一般用于二进制文件的输入/输出
若文件以二进制形式打开,用fread或fwrite 可读写任何类型的数据。

案例:
例如:输入4个学生数据,转存到磁盘文件,在屏幕上显示文件内容。

#include <stdio.h>
#define SIZE 4
struct student_type
{ 
   
	char name[10];
	int num;
	int age;
	char addr[15];
}stud[SIZE];

void display();
void save();
int main()
{ 
   
	int i;
	for (i = 0; i < SIZE; i++)
	{ 
   
		scanf_s("%s", &stud[i].name, 10);
		scanf_s("%d", &stud[i].num);
		scanf_s("%d", &stud[i].age);
		scanf_s("%s", &stud[i].addr, 15);
	}
	save();
	display();
	return 0;
}

void save()
{ 
   
        FILE *fp;
        int  i;
        if ((fopen_s(&fp,"D:\\stu_list", "wb")) != 0)
        { 
   
	printf("cannot open 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);
}
void display()
{ 
   
        FILE *fp;
        int  i;
        if ((fopen_s(&fp,"D:\\stu_list", "rb")) != 0)
        { 
   
	printf("Cannot open file\n");   return;
        }
        for (i = 0; i<SIZE; i++)
        { 
   
	fread(&stud[i], sizeof(struct student_type), 1, fp);
	printf("%-10s %4d %4d %-15s\n", stud[i].name,stud[i].num, stud[i].age, stud[i].addr);
        }
	fclose(fp);
}

格式化读写文件操作

fscanf_s() 和 fprintf() 的读写对象不是键盘和显示器,而是磁盘数据文件。
文件操作中的格式化输入输出函数 fscanf_s和 fprintf 一定意义上就是 scanf 和 printf 的文本版本。

文件格式化输入函数 fscanf_s的函数原型为:
int fscanf_s(文件指针,格式控制串,输入地址表列);

所在头文件:<stdio.h>
**函数功能:**从一个文件流中执行格式化输入,当遇到空格或者换行时结束。
注意:
该函数遇到空格时也结束,这是其与 fgets 的区别,fgets 遇到空格不结束。

返回值:
输入成功时,返回输入的数据个数;
输入失败,或已读取到文件结尾处,返回 EOF(-1)。

故一般可根据该函数的返回值是否为 EOF 来判断是否已读到文件结尾处。

案例:
格式化读写文件操作(一)

#include<stdio.h>
int main()
{ 
   	
	int ixnumber, iynumber;
	FILE *fp=NULL;
	fopen_s(&fp, "D:\\datafile.txt", "r");     
	if (fp == NULL)
	{ 
   
		printf("Failed to open the File!\n");
		exit(0);
	}
	fscanf_s(fp, "%d,%d", &ixnumber, &iynumber);
	 //从fp所指文件中读取一个整数保存到变量ixnumber, iynumber
	printf("\n%d,%d\n\n", ixnumber, iynumber);
	fclose(fp);
	return 0;
}

结果为:
在这里插入图片描述

文件格式化输出函数 fprintf 的函数原型为:
int fprintf (文件指针,格式控制串,输出表列);

所在头文件:<stdio.h>
函数功能:把输出列表中的数据按照指定的格式输出到文件中。
返回值:输出成功,返回输出的字符数;输出失败,返回一负数。

【实战案例】格式化读写文件操作(二)

#include<stdio.h>
int main()
{ 
   	
	int ixnumber, iynumber;
	FILE *fp=NULL;
	fopen_s(&fp, "D:\\datafile.txt", "w");     
	if (fp == NULL)	
	{ 
   
		printf("Failed to open the File!\n");
		exit(0);
	}	
	char name[10] = "张三";
	char no[15] = "20190410001";
	int age = 17;
	fprintf(fp, "%s\t%s\t%d\n", name, no, age);
	fclose(fp);
	return 0;
}

文件定位函数

在这里插入图片描述
C语言规定的起始位置有三种,分别为文件开头、当前位置和文件末尾,每个位置都用对应的常量来表示:
在这里插入图片描述
例如:把位置指针移动到离文件开头100个字节处:
fseek(fp, 100, 0);
值得说明的是,fseek() 一般用于二进制文件,在文本文件中由于要进行转换,计算的位置有时会出错。

作业使用案例(自己可以全部完成一遍):

使用fgetc()、fputc()、fgets()、fputs()、fread()、fwrite()、fscanf_s()、fprintf()、rewind()、fseek()实现文件输入输出操作。

代码如下:

#include<stdio.h>
#include<stdint.h>
#include<stdlib.h>
#include<Windows.h>


int main()
{ 
   
	FILE *fp = NULL;
	fopen_s(&fp, "text.txt", "r");
	if (fp == NULL)
	{ 
   
		printf("文件打开失败\n");
	}
	else
	{ 
   
		printf("文件打开成功\n");
	}
	char ch;
	ch = fgetc(fp);		// 读取字符
	while (ch != EOF)
	{ 
   
		putchar(ch);		// 打印读取的字符
		ch = fgetc(fp);		// 再一次读 重新赋值ch
	}
	printf("\n");
	fclose(fp);
	fopen_s(&fp, "text.txt", "a+");
	char ch1;
	ch1 = getchar();
	while (ch1 != '#')
	{ 
   
		fputc(ch1, fp);
		ch1 = getchar();
	}
	fclose(fp);


	FILE *in, *out;
	char ch2;

	if ((fopen_s(&in, "dd.txt", "r")) != 0)
	{ 
   
		printf("文件打开失败!\n");
	}
	if ((fopen_s(&out, "ee.txt", "w")) != 0)
	{ 
   
		printf("文件打开失败!\n");
	}
	while (!feof(in))
	{ 
   
		fputc(fgetc(in), out);
	}
	fclose(in);
	fclose(out);

	FILE*fp2;
	fopen_s(&fp2, "bb.txt", "a+");
	char str[] = "chuan";
	fputs(str, fp2);
	fclose(fp2);


	FILE *fp1;
	int a, b;
	fopen_s(&fp1, "file.txt", "a+");
	if (fp1 == NULL)
	{ 
   
		printf("文件打开失败\n");
	}
	fscanf_s(fp1,"%d,%d", &a, &b);
	printf("%d,%d\n", a, b);

	fprintf(fp1, "%d%d\n", a, b);
	fclose(fp1);

	FILE*fq3;
	fopen_s(&fq3,"bb.txt", "wb+");
	int se = 1;
	if (fread(&se, sizeof(4), 1, fq3) != 0)
	{ 
   
		printf("文件打开失败");
	}
	if (fwrite(&se, sizeof(4), 1, fq3) != 0)
	{ 
   
		printf("文件写入失败");
	}


	system("pause");
	return 0;
}

结果如下:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170984.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Ubuntu下安装vscode_附近有安装etc的吗

    Ubuntu下安装vscode_附近有安装etc的吗目录一、安装VSCode1、VSCode下载2、安装VSCode二、配置C/C++环境1、配置g++环境1.1安装vim1.2安装g++2、安装汉化、C/C++插件3、建立工程4、更改lanuch.json文件5、更改task.json文件6、完美运行我的Ubuntu已经换源了,但是在浏览器中下载比较慢,可以在window中下载好直接拖到虚拟机中。如何在windows和虚拟机Ubuntu中拖拽文件参阅:两行代码实现Windows和…

    2022年9月18日
    0
  • BP神经网络预测实例(matlab代码,神经网络工具箱)

    BP神经网络预测实例(matlab代码,神经网络工具箱)目录辛烷值的预测matlab代码实现工具箱实现参考学习b站:数学建模学习交流bp神经网络预测matlab代码实现过程辛烷值的预测【改编】辛烷值是汽油最重要的品质指标,传统的实验室检测方法存在样品用量大,测试周期长和费用高等问题,不适用于生产控制,特别是在线测试。近年发展起来的近红外光谱分析方法(NIR),作为一种快速分析方法,已广泛应用于农业、制药、生物化工、石油产品等领域。其优越性是无损检测、低成本、无污染,能在线分析,更适合于生产和控制的需要。实验采集得到50组汽油样品(辛烷值已通过其他方法测

    2022年6月20日
    22
  • 电机的力矩计算

    电机的力矩计算1.转动惯量的公式1.1转矩如何计算转矩等于转动惯量乘以角加速度,然后我们要注意一下单位,转矩的单位是NM,转动惯量的单位是kg*m2,角加速度单位是rad/s2。M=I*BM是转矩,I是转动惯量,B是角加速度。1.2关于单位转矩=转动惯量*角加速度,转矩单位是N.m,转动惯量单位是Kg.m^2,那么角加速度单位是什么,如果是rad/s^2,怎么推算的?rad不是物理量单位,是角度单位,以rad做角度单位时,rad无需写明,除非强调时。即角速度单位就是s^-1,角加速度单

    2022年5月14日
    69
  • java中的Cipher类

    java中的Cipher类随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)该类位于javax.crypto包下,声明为publicclassCipherextendsObject此类为加密和解密提供密码功能。它构成了JavaCryptographicExtension…

    2022年9月4日
    4
  • busybox最新版(busybox apk)

    把”busybox-armv6l”重命名为”busybox”;将busybox传入手机的SD卡,打开terminal(Linux,Mac)或cmd(Windows)adbpush~/Desktop/busybox/mnt/sdcard其中的~/Desktop请根据自己的情况替换成正确的路径输入以下命令,为了在/system目录写入文件adbshellsumount-oremount,r…

    2022年4月12日
    83
  • excel计算两个经纬度距离_经纬度与距离换算公式

    excel计算两个经纬度距离_经纬度与距离换算公式1.参考:http://jingyan.baidu.com/article/48b558e34df4d47f39c09a42.html 在E2单元格输入公式=6371004*ACOS(1-(POWER((SIN((90-B2)*PI()/180)*COS(A2*PI()/180)-SIN((90-D2)*PI()/180)*COS(C2*PI()/180)),2)+POWER((SIN(…

    2022年9月23日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号