开发成长之路(4)-- C语言从入门到开发(距离开发,还差这一篇) 文章目录文件读写C分文件编程盘...
作者: CSDN博客 更新时间:2021-05-08 09:41:37 原文链接
文章目录
在前面几篇,基本知识也讲的差不多了,再讲一下文件读写、分文件编程与其他知识点,就可以进入第一轮的项目开发流程了。
文件读写
在我刚接触这一个知识点的时候,我是非常害怕的。不知道各位是什么心情,我那时候只是个培训了一个月的菜鸟。
但是呢,随着学习的深入,我现在反倒觉得,文件读写,比前面的链表操作要简单的多,甚至于比那个输入输出控制函数都要简单。
使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件:
FILE *fopen( const char * filename, const char * mode ); //返回值是一个文件句柄
第一个参数是文件名,第二个参数是打开权限:
模式 | 描述 |
---|---|
r | 打开一个已有的文本文件,允许读取文件。 |
w | 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。程序会从文件的开头写入内容。如果文件存在,会造成覆盖。 |
a | 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。如果存在,程序会在已有的文件内容中追加内容。 |
r+ | 打开一个文本文件,允许读写文件。 |
w+ | 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。 |
a+ | 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。 |
二进制的话,加一个b,碧如:wb
关闭文件的话:
int fclose( FILE *fp );
写入文件:
fwrite(data,size,1,fp);
参数释义:
待写入数据、写入大小、默认为1、文件句柄。
读取文件:
fread(data, size, 1, fp);
参数释义:
存储读取数据、读取大小、默认为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; }
C分文件编程
在写项目的时候,总不可能是把所有代码都写在一个文件里面吧,这样就太low了。
应该根据功能将代码划分到不同的文件中去。
这里有些注意点:
1、创建同名的头文件(.h)和cpp文件。 2、在头文件里写函数声明,在cpp文件中写函数定义。 3、在cpp文件中写#include "xx.h" //自定义头文件名 4、框架(include using namespace std;)写在.h文件中
慢慢就习惯了。
像这样:

接下来,我们盘点一下前边落下的那些知识点:
A = 20,B = 10;
运算符 | 描述 | 实例 |
---|---|---|
+ | 把两个操作数相加 | 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;
在这个类型定义之后,标识符 BYTE 可作为类型 unsigned char 的缩写
预处理器
在头文件中,一般开头会这么写:
这是一个other.h的文件
#ifndef _OTHER_H_ #define _OTHER_H_
末尾:
#endif
指令 | 描述 |
---|---|
#define | 定义宏 |
#include | 包含一个源代码文件 |
#undef | 取消已定义的宏 |
#ifdef | 如果宏已经定义,则返回真 |
#ifndef | 如果宏没有定义,则返回真 |
#if | 如果给定条件为真,则编译下面代码 |
#else | #if 的替代方案 |
#elif | 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码 |
#endif | 结束一个 #if……#else 条件编译块 |
#error | 当遇到标准错误时,输出错误消息 |
#pragma | 使用标准化方法,向编译器发布特殊的命令到编译器中 |
强制类型转换
强制类型转换是把变量从一种类型转换为另一种数据类型。
像这样:
(type_name) expression
int main() { int sum = 17, count = 5; double mean; mean = (double) sum / count; printf("Value of mean : %f\n", mean ); }
强转有风险,使用需谨慎。
使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。
static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。
extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 extern 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
盘点完毕,下一篇进项目!!!