Day 3. Linux高级编程之函数接口和流的定位

gets和fgets区别

1)gets没有给定最多读取字符的个数,有越界风险\n\n      

  fgets需要给定最多读取的字符个数,没有越界的风险\n\n

2)gets会去掉从终端接收的/n,换成/0\n\n fgets则会保留并在末尾加上/0\n\n

3)puts会在字符串末尾多打印一个/n字符\n\n      

  fputs不会在末尾多打印/n字符

函数接口:

1.fwrite

      size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
      功能:
        向流中写入nmemb个对象,每个对象size字节大小,在ptr指向的空间中
      参数:
        ptr:存放数据空间的首地址
        size:每个数据对象的大小
        nmemb:数据对象的个数
        stream:文件流指针
      返回值:
        成功返回写入对象的个数
        失败返回0
        读到文件末尾返回0 

练习:

将多个对象写入到指定文件中

#include <stdio.h>

typedef struct student
{
	char name[32];
	char sex;
	int age;
	int score;
}stu_t;

int main (void)
{
	stu_t a = {"zhangsan",'m',18,167};
	stu_t s[3]={
	      {"lisi",'f',17,155},
		  {"wamngliu",'m',18,167},
		  {"jiuqi",'m',17,163},
	};

	FILE *fp = NULL;

	fp = fopen("file.txt","w");
	if (fp == NULL)
	{
		perror("file to fopen");
		return -1;
	}
    
	fwrite(&a,sizeof(stu_t),1,fp);
 
	fwrite(s,sizeof(stu_t),3,fp);

	fclose(fp);

	return 0;
}

2.fread

      size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
      功能:
        从流中读取nmemb个对象,每个对象size个字节,存放到ptr指向的空间中
      参数:
        ptr:存放读取内容空间首地址
        size:读取对象的大小
        nmemb:读取对象的个数
        stream:文件流指针 
      返回值:
        成功返回读到对象个数
        失败返回0
        读到文件末尾返回0 

练习:

将指定文件中的内容读出来并展示在终端上

#include <stdio.h>

typedef struct student
{
	char name[32];
	char sex;
	int age;
	int score;
}stu_t;


int ShowStuInfo(stu_t tmpstu)
{
	printf("姓名:%s\n",tmpstu.name);
	printf("性别:%c\n",tmpstu.sex);
	printf("年龄:%d\n",tmpstu.age);
	printf("成绩:%d\n",tmpstu.score);
	return 0;
}

int main (void)
{
	FILE *fp = NULL;

	stu_t s[5];
	size_t ret;
	int i = 0;
	stu_t a;
	fp = fopen("file.txt","r");
	if (fp == NULL)
	{
		perror("file to fopen");
		return -1;
	}

	fread(&a,sizeof(stu_t),1,fp);
	ShowStuInfo(a);
    
    ret = fread(s,sizeof(stu_t),5,fp);
	for (i = 0;i < ret;++i)
	{
		ShowStuInfo(s[i]);
	}

	printf("ret = %ld\n",ret);
	fclose(fp);

	return 0;
}

练习:

 利用fread和fwrite完成将src.jpg图片内容拷贝到dst.jpg图片中 char tmpbuff[4096];

#include <stdio.h>

int main(void)
{
	FILE *fp = NULL;
	FILE *fq = NULL;

	char s[4096];
    size_t ret = 0;
	fp = fopen("src.jpg","r");
	fq = fopen("dst.jpg","w");

	if (fp == NULL)
	{
		perror("file to fopen");
		return -1;
	}

	if (fq == NULL)
	{
		perror("file to fopen");
		return -1;
	}

	while(1)
	{
	    ret = fread(s,1,sizeof(s),fp);
	    if (ret == 0)
	    {
			break;
	    }
        fwrite(s,1,ret,fq);
    }
	fclose(fp);
	fclose(fq);

	return 0;
}

3.fprintf

       int fprintf(FILE *stream, const char *format, ...);
      功能:
        将格式化字符串输出到stream指向的流中

        printf
        fprintf(stdout, );

练习:

#include <stdio.h>

int main (void)
{
	FILE *fp = NULL;
    int num1 = 100;
	int num2 = 200;

	fp = fopen("file.txt","w");
	if(fp == NULL)
	{
		perror("file to fopen");
		return -1;
	}

	fprintf(fp,"hello world! num1 = %d num2 = %d\n",num1,num2);

	fclose(fp);

	return 0;
}

4.fscanf

      int fscanf(FILE *stream, const char *format, ...);
      功能:
        从流中读取格式化的字符串

流的定位

  1.ftell

      long ftell(FILE *stream);
      功能:
        获得流的偏移量

   2.rewind

      void rewind(FILE *stream);
      功能:
        将流的偏移量重新设置到开头

  3.fseek 

      int fseek(FILE *stream, long offset, int whence);
      功能:
        设置流的偏移量
      参数:
        stream:文件流指针
        offset:偏移量
            > 0 向后偏移
            < 0 向前偏移
        whence:
            SEEK_SET    文件开头
            SEEK_CUR    文件当前位置
            SEEK_END    文件末尾

练习:

#include <stdio.h>

int main(void)
{
	FILE *fp = NULL;

	fp = fopen("file.txt","w");
	if (fp == NULL)
	{
		perror("file to fopen");
		return -1;
	}
	fseek(fp,10,SEEK_SET);
	fprintf(fp,"hello");

	fseek(fp,-5,SEEK_CUR);
	fprintf(fp,"app");

	fseek(fp,6,SEEK_END);
	fprintf(fp,"world");

	fclose(fp);

	return 0;
}

    练习:

编写一个程序实现统计一个文件的大小

#include <stdio.h>

int main (void)
{
	FILE *fp = NULL;

	int len = 0;

	fp = fopen("file.txt","r");
	if (fp == NULL)
	{
		perror("file to fopen");
		return -1;
	}

   fseek(fp,0,SEEK_END);
   len = ftell(fp);

   printf("len = %d\n",len);

   fclose(fp);
   
   return 0;
}

作业:

从终端输入一个单词,获得单词的含义  含义在文件dict.txt中

int main (void)
{
	char s[30];              //定义一个数组接收需要查找的单词
	char timp[4096];          //定义一个数组接收一行字符串
	char *ptmp = NULL;            
	char *pret = NULL;          
	 
	printf("Enter a word: \n");
	gets(s);                            //输入要查找的单词

	FILE *fp = NULL;
	fp = fopen("dict.txt","r");          //打开并读取这个文件
	if (fp == NULL)
	{
		perror("file to fopen");
		return -1;
	}

	while(1)
	{
		pret = fgets(timp,sizeof(timp),fp);      //进入循环并用pret接收这一行字符串的地址
		if (pret == NULL)                           
		{                             //若pret为空说明最后一行都读完了
			break;
		}

		ptmp = timp;                                   //定义一个指针指向接收的一行字符串的开头
		while (*ptmp != ' ' && *ptmp != '\0')    
		{
			ptmp++;                        //进入循环 如果指针没有指向了空格和'\0',就继续向后移动 遇到空格或‘0’就跳出
		}
		*ptmp = '\0';             //在遇到空格的位置补'\0'

		ptmp++;                //指针在继续往后移动一位
		while (*ptmp != ' ')       //进入循环 如果指针没有指向了空格
		{
			ptmp++;            //继续往后移动 直到跳出 并分成了单词和后面注释这两部分  此时ptmp就为注释的这个字符串的首地址
		}

		if (strcmp(s,timp) == 0)           //比较这两个单词 如果相等
		{
			printf("ptmp:%s\n",ptmp);     //打印出后面的注释
			fclose(fp);  
			return 0;   //关闭流  退出
		}
	}

	printf("%s不存在!\n",s);    
	fclose(fp);

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/373672.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最小生成树超详细介绍

目录 一.最小生成树的介绍 1.最小生成树的简介 2.最小生成树的应用 3.最小生成树的得出方法 二.Kruskal算法 1.基本思想&#xff1a; 2.步骤&#xff1a; 3.实现细节&#xff1a; 4.样例分析&#xff1a; 5.Kruskal算法代码实现&#xff1a; 三.Prim算法 1.基本思想…

【华为 ICT HCIA eNSP 习题汇总】——题目集12

1、企业网络内部常常采用私有 IP 地址进行通信&#xff0c;以下哪个地址属于私有 IP 地址&#xff1f; A、0.1.1.1 B、127.5.4.3 C、128.0.0.5 D、172.24.35.36 考点&#xff1a;网络层 解析&#xff1a;&#xff08;D&#xff09; A类 IP 地址中&#xff0c;10.0.0.0 ~ 10.255…

SpringSecurity(18)——OAuth2授权码管理

AuthorizationCodeServices public interface AuthorizationCodeServices {//为指定的身份验证创建授权代码。String createAuthorizationCode(OAuth2Authentication authentication);//使用授权码。OAuth2Authentication consumeAuthorizationCode(String code)throws Invali…

ACM训练题:Raising Modulo Numbers

主要意思就是上面的式子&#xff0c;求幂的和的模&#xff0c;求幂自然是快速幂&#xff0c;这里都带上模&#xff0c;求和的模也可以分开取模。 AC代码&#xff1a; #include <iostream> using namespace std; long long Z,M,H,a,b; long long quick_mi(long long x,l…

【数据结构与算法】(11)基础数据结构 之 二叉树 二叉树的存储与遍历及相关示例 详细代码讲解

目录 2.10 二叉树1) 存储2) 遍历广度优先深度优先递归实现非递归实现 习题E01. 前序遍历二叉树-Leetcode 144E02. 中序遍历二叉树-Leetcode 94E03. 后序遍历二叉树-Leetcode 145E04. 对称二叉树-Leetcode 101E05. 二叉树最大深度-Leetcode 104E06. 二叉树最小深度-Leetcode 111…

R语言:箱线图绘制(添加平均值趋势线)

箱线图绘制 1. 写在前面2.箱线图绘制2.1 相关R包导入2.2 数据导入及格式转换2.3 ggplot绘图 1. 写在前面 今天有时间把之前使用过的一些代码和大家分享&#xff0c;其中箱线图绘制我认为是非常有用的一个部分。之前我是比较喜欢使用origin进行绘图&#xff0c;但是绘制的图不太…

C++杂选

#include <iostream> #include <regex>using namespace std;int main() { //它声明了一个 string 类型的变量 input&#xff0c;用于存储输入的字符串。然后使用 getline() 函数从标准输入中读取一行输入&#xff0c;并将其存储在 input 变量中。string input;getl…

PAT-Apat甲级题1008(python和c++实现)

PTA | 1008 Elevator 1008 Elevator 作者 CHEN, Yue 单位 浙江大学 The highest building in our city has only one elevator. A request list is made up with N positive numbers. The numbers denote at which floors the elevator will stop, in specified order. It …

c#读取csv文件中的某一列的数据

chat8 (chat779.com) 上面试GPT-3.5,很好的浏览网站&#xff0c;输入问题&#xff0c;可得到答案。 问题1&#xff1a;c#如何在csv中读取某一列数据 解答方案&#xff1a;在 C#中&#xff0c;你可以使用File.ReadAllLines来读取CSV中的所有行&#xff0c;然后逐行解析每一行…

机器学习---概率图模型(隐马尔可夫模型、马尔可夫随机场、条件随机场)

1. 隐马尔可夫模型 机器学习最重要的任务是根据已观察到的证据&#xff08;例如训练样本&#xff09;对感兴趣的未知变量&#xff08;例如类别标 记&#xff09;进行估计和推测。概率模型&#xff08;probabilistic model&#xff09;提供了一种描述框架&#xff0c;将描述任…

网络选择流程分析(首选网络类型切换流程)

首先是界面,我在此平台的界面如下: 对应的入口源码位置在Settings的UniEnabledNetworkModePreferenceController中,当然其他平台可能在PreferredNetworkModePreferenceController中,流程上都是大同小异 然后点击切换按钮会调用到UniEnabledNetworkModePreferenceControlle…

智算中心建设主流加速卡选型策略

智算中心建设主流加速卡选型对比 —— 加速卡H800、A800、L40S、***B 一、加速卡基本性能比较 序号比较项H800A800L40S某国产NPU&#xff08;本文简称“nB”&#xff09; 1 加速卡类型 GPU GPU GPU NPU 2 供应商 英伟达 英伟达 英伟达 - 3 FP32&#xff08;TFLO…

MySQL查询优化技巧和10个案例展示

优化MySQL查询的实战技巧&#xff1a; **避免使用SELECT ***&#xff1a;只获取需要的列&#xff0c;这样可以减少数据传输量&#xff0c;提高查询效率。使用索引&#xff1a;为查询频繁的列创建索引&#xff0c;可以显著提高查询速度。但请注意&#xff0c;索引并非万能&…

Android中设置Toast.setGravity()了后没有效果

当设置 toast.setGravity()后&#xff0c;弹窗依旧从原来的位置弹出&#xff0c;不按设置方向弹出 类似以下代码&#xff1a; var toast Toast.makeText(this, R.string.ture_toast, Toast.LENGTH_SHORT)toast.setGravity(Gravity.TOP, 0, 0)//设置toast的弹出方向为屏幕顶部…

绕过安全狗

本节我们想要绕过的安全狗版本为v4.023957 &#xff0c;它是网站安全狗的Apache版。 首先搭建环境。渗透环境选用DVWA漏洞集成环境&#xff0c;下载地址 为http://www.dvwa.co.uk/ 。DVWA是一款集成的渗透测试演练环境&#xff0c;当刚刚入门 并且找不到合适的靶机时&#xff…

Bytebase 签约 Vianova,助力欧洲城市交通智能平台中 Snowflake 和 PG 的变更自动化及版本控制

在数字化发展的浪潮中&#xff0c;自动化数据库变更管理成为提升产品上线效率、降低人为失误风险的关键工具&#xff0c;同时促进流程的一致性与标准化&#xff0c;确保合规性和变更的可追溯性。近日&#xff0c;数据库 DevOps 团队协同管理工具 Bytebase 签约欧洲交通数据管理…

H12-821_134

134.如图所示&#xff0c;RED在入方向调用了ip as-path-filter1&#xff0c;那么路由10.0.0.0/24会从路径_________被RE_D学习。(请填写1或2) 答案&#xff1a;1 注释&#xff1a; ip as-path-filter 1解释&#xff1a; ip as-path-filter 1 deny _300$ 拒绝AS300始发的路由&…

图像异或加密、解密的实现

很多论文提到了从左上角开始做异或,逐行推导得到结果。 解密过程是加密的逆过程。 先看其基本方法: 参考文献: A Chaotic System Based Image Encryption Scheme with Identical Encryption and Decryption Algorithm 大多数论文都用了这个思路,我们使用MATLAB实现代码…

ASUS华硕灵耀X双屏UX8402V工厂模式原厂Win11.22H2系统安装包,含WinRE恢复出厂时开箱状态自带预装OEM系统

适用型号&#xff1a;UX8402VV、UX8402VU 链接&#xff1a;https://pan.baidu.com/s/1D7tJshKTNFYO4YyzKX0ppQ?pwd3saf 提取码&#xff1a;3saf Zenbook Pro灵耀X笔记本电脑原装出厂Windows11系统 带有ASUS RECOVERY恢复功能、自带面部识别&#xff0c;声卡&#xff0c;网…

PySpark(四)PySpark SQL、Catalyst优化器、Spark SQL的执行流程

目录 PySpark SQL 基础 SparkSession对象 DataFrame入门 DataFrame构建 DataFrame代码风格 DSL SQL SparkSQL Shuffle 分区数目 DataFrame数据写出 Spark UDF Catalyst优化器 Spark SQL的执行流程 PySpark SQL 基础 PySpark SQL与Hive的异同 Hive和Spark 均是:“分…