条件编译
#include <stdio.h> //#include 头文件包含.h以及.c
#include "2_2temp.c" //.c和.h只是一个名称后缀而已,既然C程序员约定熟成了,根据约定来
int main()
{
Print();
return 0;
}
#include <stdio.h>
//内容1:#if #else #endif
//内容2:#ifndef #else #endif
//内容3:#ifdef #else #endif
//#if 与 if 多了一个#号,#号操作的是预处理阶段
//#if 他是一个预处理阶段的分支语句
#if 0 //内容1:#if #else #endif
int main()
{
#if (0)
printf("#if 条件为真\n");
#else
printf("#if 条件为假\n");
#endif //结束预处理判断
return 0;
}
#endif
//内容2:#ifndef #else #endif //常用于防止头文件重复导入
#define _huawei_
#include "3_3_1源文件.h"
int main()
{
Print();
return 0;
}
防止源文件重复导入
#if 0
#ifndef _OTHER_H_ //判断宏定义没有定义,则执行
#define _OTHER_H_ //定义宏 _OTHER_H_
void Print();
int num = 10;
//代码非常多的情况显示非常糅杂
#else //否则判断宏定义有定义,则执行
#endif
#else
//内容3:常用于判断机器型号:安卓系统,版本,手机型号不同
//第一个版本:安卓1.0 ->手机:小米,华为,山寨
#ifdef _anzuo_ //判断宏定义有定义,则执行
const int cun = 7.7;
#endif
#ifdef _huawei_ //判断宏定义有定义,则执行
const int cun = 14;
#endif
#ifdef _shanzai_ //判断宏定义有定义,则执行
const int cun = 3.4;
#endif
#endif
文件操作
文件的分类
磁盘文件
指一组相关数据的有序集合,通常存储在外部介质(如磁盘)上,使用时才调入 内存。
磁盘文件的分类
(从用户或者操作系统使用的角度(逻辑上)把文件分为)
- 文本文件:基于字符编码的文件
- 二进制文件:基于值编码的文件
设备文件
在操作系统中把每一个与主机相连的输入、输出设备看作是一个文件,把它们 的输入、输出等同于对磁盘文件的读和写。
文件打开和文件关闭
#include <stdio.h>
//文件操作步骤1.打开文件,2.读写文件,3.关闭文件
//stdin:全缓冲
//stdout:行缓冲
//stderr:无缓冲
int main()
{
int num = 0;
fscanf(stdin,"%d",&num); //stdin:全缓冲:当数据满则输出
printf("num = %d\n",num);
fprintf(stdout,"张三\n"); //stdout:行缓冲:当数据遇到换行则输出
fprintf(stderr,"张三111"); //stderr:无缓冲:有有数据就输出
FILE *fp = fopen("1_文件操作.c","r");
if(fp == NULL)
{
return -1;
}
printf("size = %d\n",fp->_flags2);
return 0;
}
打开文件的方式
#include <stdio.h>
/*******************************
头文件:#include <stdio.h>
函数名:FILE * fopen(const char * filename, const char * mode);
功能:打开文件
参数:
filename:需要打开的文件名,根据需要加上路径
mode:打开文件的模式设置
返回值:
成功:文件指针
失败:NULL
********************************/
/*******************************
头文件:#include <stdio.h>
函数名:int fclose(FILE * stream);
功能:关闭先前fopen()打开的文件。此动作让缓冲区的数据写入文件中,并释放系统所提供的文件资源。
参数:
stream:文件指针
返回值:
成功:0
失败:-1
********************************/
//文件操作的步骤:
//1.打开文件
//2.判断文件是否真的打开
//3.如果打开成功则进行读写操作
//4.关闭文件
int main()
{
//1.1打开,以只读方式,如果成功返回!NULL如果失败返回NULL
//FILE *fp = fopen("test.txt","r");
//1.2打开,以只写方式,如果文件存则清空,如果文件不存在则创建一个文件
//FILE *fp = fopen("test.txt","w");
//1.3打开,以追加方式,如果文件存则跳转到文件尾部进行写操作,如果文件不存在则创建一个文件
FILE *fp = fopen("test.txt","a");
if(fp == NULL)
{
printf("文件打开失败\n");
return -1;
}
printf("文件打开成功\n");
//4.关闭文件
fclose(fp);
return 0;
}
文件的顺序读写
fputc、fgetc函数
#include <stdio.h>
/*******************************
头文件:#include <stdio.h>
函数名:int fputc(int ch, FILE * stream);
功能:将ch转换为unsigned char后写入stream指定的文件中
参数:
ch:需要写入文件的字符
stream:文件指针
返回值:
成功:成功写入文件的字符
失败:返回-1
********************************/
/*****************************
头文件:#include <stdio.h>
函数名:int fgetc(FILE * stream);
功能:从stream指定的文件中读取一个字符
参数:
stream:文件指针
返回值:
成功:返回读取到的字符
失败:-1
* ******************************/
//文件操作的步骤:
//1.打开文件
//2.判断文件是否真的打开
//3.如果打开成功则进行读写操作
//4.关闭文件
int main()
{
//1.1打开,以只读方式,如果成功返回!NULL如果失败返回NULL
//FILE *fp = fopen("test.txt","r");
//1.2打开,以只写方式,如果文件存则清空,如果文件不存在则创建一个文件
//FILE *fp = fopen("test.txt","w");
//1.3打开,以追加方式,如果文件存则跳转到文件尾部进行写操作,如果文件不存在则创建一个文件
FILE *fp = fopen("test.txt","r");
if(fp == NULL)
{
printf("文件打开失败\n");
return -1;
}
#if 0
if(fputc('t',fp) == -1)
{
printf("写入失败\n");
}
else{
printf("写入成功\n");
}
#endif
char ch = -1;
while(1)
{
ch = fgetc(fp);
if(ch == -1)
{
break;
}
printf("%c",ch);
}
printf("文件打开成功\n");
//4.关闭文件
fclose(fp);
return 0;
}
fputs、fgets函数
#include <stdio.h>
/*******************************
头文件:#include <stdio.h>
函数名:int fputs(const char * str, FILE * stream);
功能:将str所指定的字符串写入到stream指定的文件中,字符串结束符 '\0' 不写入文件。
参数:
str:字符串
stream:文件指针
返回值:6
成功:0
失败:-1
********************************/
/*****************************
头文件:#include <stdio.h>
函数名:char * fgets(char * str, int size, FILE * stream);
功能:从stream指定的文件内读入字符,保存到str所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size - 1个字符为止,最后会自动加上字符 '\0' 作为字符串结束。
参数:
str:字符串要存储的空间首地址
size:指定最大读取字符串的长度(size - 1)
stream:文件指针
返回值:
成功:成功读取的字符串
读到文件尾或出错: NULL
* ******************************/
//文件操作的步骤:
//1.打开文件
//2.判断文件是否真的打开
//3.如果打开成功则进行读写操作
//4.关闭文件
int main()
{
//1.1打开,以只读方式,如果成功返回!NULL如果失败返回NULL
//FILE *fp = fopen("test.txt","r");
//1.2打开,以只写方式,如果文件存则清空,如果文件不存在则创建一个文件
//FILE *fp = fopen("test.txt","w");
//1.3打开,以追加方式,如果文件存则跳转到文件尾部进行写操作,如果文件不存在则创建一个文件
FILE *fp = fopen("test.txt","r");
if(fp == NULL)
{
printf("文件打开失败\n");
return -1;
}
#if 0
if(fputs("华清远见,你好,我是来学习\nC语言的\n多多指教",fp) == -1)
{
printf("写入失败\n");
}
else{
printf("写入成功\n");
}
#else
char buf[1024] = "";
while(fgets(buf,sizeof(buf) - 1,fp) != NULL)
{
printf("%s",buf);
}
#endif
printf("文件打开成功\n");
//4.关闭文件
fclose(fp);
return 0;
}
fprintf、fscanf函数
#include <stdio.h>
/*******************************
头文件:#include <stdio.h>
函数名:int fprintf(FILE * stream, const char * format, ...);
功能:根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符 '\0' 为止。
参数:
stream:已经打开的文件
format:字符串格式,用法和printf()一样
返回值:
成功:实际写入文件的字符个数
失败:-1
********************************/
/*****************************
头文件:#include <stdio.h>
函数名:int fscanf(FILE * stream, const char * format, ...);
功能:从stream指定的文件读取字符串,并根据参数format字符串来转换并格式化数据。
参数:
stream:已经打开的文件
format:字符串格式,用法和scanf()一样
返回值:
成功:参数数目,成功转换的值的个数
失败: - 1
* ******************************/
//文件操作的步骤:
//1.打开文件
//2.判断文件是否真的打开
//3.如果打开成功则进行读写操作
//4.关闭文件
int main()
{
//1.1打开,以只读方式,如果成功返回!NULL如果失败返回NULL
//FILE *fp = fopen("test.txt","r");
//1.2打开,以只写方式,如果文件存则清空,如果文件不存在则创建一个文件
//FILE *fp = fopen("test.txt","w");
//1.3打开,以追加方式,如果文件存则跳转到文件尾部进行写操作,如果文件不存在则创建一个文件
FILE *fp = fopen("test.txt","r");
if(fp == NULL)
{
printf("文件打开失败\n");
return -1;
}
#if 0
if(fprintf(fp,"姓名:%s 年龄:%d岁 身高:%dcm\n","张三",18,185) == -1)
{
printf("写入失败\n");
}
else{
printf("写入成功\n");
}
#else
char name[128] = "";
int age = 0;
int height = 0;
fscanf(fp,"姓名:%s 年龄:%d岁 身高:%dcm",name,&age,&height);
printf("姓名:%s 年龄:%d岁 身高:%dcm\n",name,age,height);
#endif
printf("文件打开成功\n");
//4.关闭文件
fclose(fp);
return 0;
}
fwrite、fread函数
#include <stdio.h>
/*******************************
头文件:#include <stdio.h>
函数名:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:以数据块的方式给文件写入内容
参数:
ptr:准备写入文件数据的地址
size: size_t 为 unsigned int类型,此参数指定写入文件内容的块数据大小
nmemb:写入文件的块数,写入文件数据总大小为:size * nmemb
stream:已经打开的文件指针
返回值:
成功:实际成功写入文件数据的块数目,此值和 nmemb 相等
失败:0
********************************/
/*****************************
头文件:#include <stdio.h>
函数名:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:以数据块的方式从文件中读取内容
参数:
ptr:存放读取出来数据的内存空间
size: size_t 为 unsigned int类型,此参数指定读取文件内容的块数据大小
nmemb:读取文件的块数,读取文件数据总大小为:size * nmemb
stream:已经打开的文件指针
返回值:
成功:实际成功读取到内容的块数,如果此值比nmemb小,但大于0,说明读到文件的结尾。
失败:0
* ******************************/
//使用二进制块操作的优点:人读不懂,但是计算机读得懂,人不易修改,可以适当保护数据
//文件操作的步骤:
//1.打开文件
//2.判断文件是否真的打开
//3.如果打开成功则进行读写操作
//4.关闭文件
typedef struct Student
{
char m_name[60]; //姓名
int m_age; //年龄
int m_height; //身高
}Student_t;
#include <string.h>
int main()
{
//1.1打开,以只读方式,如果成功返回!NULL如果失败返回NULL
//FILE *fp = fopen("test.txt","r");
//1.2打开,以只写方式,如果文件存则清空,如果文件不存在则创建一个文件
//FILE *fp = fopen("test.txt","w");
//1.3打开,以追加方式,如果文件存则跳转到文件尾部进行写操作,如果文件不存在则创建一个文件
FILE *fp = fopen("test.txt","r");
if(fp == NULL)
{
printf("文件打开失败\n");
return -1;
}
Student_t stu;
strcpy(stu.m_name,"张三");
stu.m_age = 18;
stu.m_height = 165;
#if 0
if(fwrite(&stu,sizeof(Student_t),1,fp) == 0)
{
printf("写入失败\n");
}
else{
printf("写入成功\n");
}
#else
Student_t stu1;
if(fread(&stu1,sizeof(Student_t),1,fp) == 0)
{
printf("读取失败\n");
}
else{
printf("读取成功\n");
printf("姓名:%s\t年龄:%d岁\t身高:%dcm\n",stu1.m_name,stu1.m_age,stu1.m_height);
}
#endif
printf("文件打开成功\n");
//4.关闭文件
fclose(fp);
return 0;
}
`