开发成长之路(4)-- C语言从入门到开发(距离开发,还差这一篇)

举报
看,未来 发表于 2021/04/28 03:37:02 2021/04/28
【摘要】 文章目录 文件读写C分文件编程盘点运算符关系运算符逻辑运算符赋值运算符字符串函数重命名预处理器强制类型转换staticextern 在前面几篇,基本知识也讲的差不多了,再讲一下文件读写、分文件编程与其他知识点,就可以进入第一轮的项目开发流程了。 文件读写 在我刚接触这一个知识点的时候,我是非常害怕的。不知道各位是什么心情,我那时候只是...

在这里插入图片描述



文件读写

在我刚接触这一个知识点的时候,我是非常害怕的。不知道各位是什么心情,我那时候只是个培训了一个月的菜鸟。

但是呢,随着学习的深入,我现在反倒觉得,文件读写,比前面的链表操作要简单的多,甚至于比那个输入输出控制函数都要简单。

使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件:

FILE *fopen( const char * filename, const char * mode );	//返回值是一个文件句柄

  
 
  • 1

第一个参数是文件名,第二个参数是打开权限:

模式 描述
r 打开一个已有的文本文件,允许读取文件。
w 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。程序会从文件的开头写入内容。如果文件存在,会造成覆盖。
a 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。如果存在,程序会在已有的文件内容中追加内容。
r+ 打开一个文本文件,允许读写文件。
w+ 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+ 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。

二进制的话,加一个b,碧如:wb

关闭文件的话:

int fclose( FILE *fp );

  
 
  • 1

写入文件:

fwrite(data,size,1,fp);	

  
 
  • 1

参数释义:
待写入数据、写入大小、默认为1、文件句柄。

读取文件:

fread(data, size, 1, fp);

  
 
  • 1

参数释义:
存储读取数据、读取大小、默认为1、文件句柄


看个实例吧:

#include"public.h"

//打开文件/
FILE * open(char * filename)
{
	FILE *fp=NULL;
	fp=fopen(filename,"r+");
	if (fp==NULL)
	{ fp=fopen(filename,"w+");
	}
	return fp;
} /用户链表写入文件//
void List_to_file(POINT_T * head,FILE * fp,int size)
{
	遍历链表并打印

	POINT_T * pNode=head; rewind(fp);
	while(pNode->next!=NULL)
	{
		pNode=pNode->next; //
	//	printf("%s %d\n",pNode->pData->t,pNode->pData->a);		这一行要不要放出来还没想清楚
		//将数据写入文件//
		fwrite(pNode->pData,size,1,fp);	
	//	printf("\n");
	}
	fflush(fp);
}


///文件写入链表//
POINT_T * File_to_list( FILE* p, int size)
{
	void * data = NULL;
	POINT_T * head  = NULL;
	int ret = -1; // 创建链表头节点
	head = creat(NULL); rewind(p);
	// 对数据域开辟空间
	data = malloc(size);
	memset(data, 0, sizeof(size)); while (1)
	{
		// 读取大小为size的数据内容
		ret = fread(data, size, 1, p);
		if (ret < 1)
		{ // 未读取到数据内容,表示文件已到结尾 break;
		}
		// 添加到链表
		add(head, data); data = malloc(size);
		memset(data, 0, sizeof(size)); } return head;
	
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76

C分文件编程

在写项目的时候,总不可能是把所有代码都写在一个文件里面吧,这样就太low了。

应该根据功能将代码划分到不同的文件中去。

这里有些注意点:

1、创建同名的头文件(.h)和cpp文件。
2、在头文件里写函数声明,在cpp文件中写函数定义。
3、在cpp文件中写#include "xx.h" //自定义头文件名
4、框架(include using namespace std;)写在.h文件中

  
 
  • 1
  • 2
  • 3
  • 4

慢慢就习惯了。

像这样:
在这里插入图片描述


接下来,我们盘点一下前边落下的那些知识点:

盘点

运算符

A = 20,B = 10;

  
 
  • 1
运算符 描述 实例
+ 把两个操作数相加 A + B 将得到 30
- 从第一个操作数中减去第二个操作数 A - B 将得到 10
* 把两个操作数相乘 A * B 将得到 200
/ 分子除以分母(去尾法保留整数) B / A 将得到 0
% 取模运算符,整除后的余数 B % A 将得到 10
++ 自增运算符,整数值增加 1 A++ 将得到 21
自减运算符,整数值减少 1 A-- 将得到 19

关系运算符

运算符 描述 实例
== 检查两个操作数的值是否相等,如果相等则条件为真。 (A == B) 为假。
!= 检查两个操作数的值是否相等,如果不相等则条件为真。 (A != B) 为真。
> 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 (A > B) 为真。
< 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 (A < B) 为假。
>= 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 (A >= B) 为真。
<= 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 (A <= B) 为假。

逻辑运算符

A = 1,B = 0;

运算符 描述 实例
&& 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 (A && B) 为假
两竖杆 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 (A 两竖杆 B) 为真
! 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 !(A && B) 为真。

赋值运算符

运算符 描述 实例
= 简单的赋值运算符,把右边操作数的值赋给左边操作数 C = A + B 将把 A + B 的值赋给 C
+= 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 C += A 相当于 C = C + A
-= 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 C -= A 相当于 C = C - A
*= 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 C *= A 相当于 C = C * A
/= 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 C /= A 相当于 C = C / A
%= 求模且赋值运算符,求两个操作数的模赋值给左边操作数 C %= A 相当于 C = C % A

字符串函数

函数 目的
strcpy(s1, s2); 复制字符串 s2 到字符串 s1。
strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。
strlen(s1); 返回字符串 s1 的长度。
strcmp(s1, s2); 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。
strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
strstr(s1, s2); 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

重命名

typedef unsigned char BYTE;

  
 
  • 1

在这个类型定义之后,标识符 BYTE 可作为类型 unsigned char 的缩写


预处理器

在头文件中,一般开头会这么写:
这是一个other.h的文件

#ifndef _OTHER_H_
#define _OTHER_H_

  
 
  • 1
  • 2

末尾:

#endif

  
 
  • 1
指令 描述
#define 定义宏
#include 包含一个源代码文件
#undef 取消已定义的宏
#ifdef 如果宏已经定义,则返回真
#ifndef 如果宏没有定义,则返回真
#if 如果给定条件为真,则编译下面代码
#else #if 的替代方案
#elif 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
#endif 结束一个 #if……#else 条件编译块
#error 当遇到标准错误时,输出错误消息
#pragma 使用标准化方法,向编译器发布特殊的命令到编译器中

强制类型转换

强制类型转换是把变量从一种类型转换为另一种数据类型。
像这样:

(type_name) expression

  
 
  • 1
int main()
{ int sum = 17, count = 5; double mean; mean = (double) sum / count; printf("Value of mean : %f\n", mean );
 
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

强转有风险,使用需谨慎。


static

使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。

static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。


extern

extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 extern 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。


盘点完毕,下一篇进项目!!!

在这里插入图片描述

在这里插入图片描述

文章来源: lion-wu.blog.csdn.net,作者:看,未来,版权归原作者所有,如需转载,请联系作者。

原文链接:lion-wu.blog.csdn.net/article/details/116204285

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。