条件编译 文件操作

本文介绍了条件编译的概念,防止源文件重复导入的方法,并深入探讨了文件操作。文件被分为磁盘文件和设备文件两大类,其中磁盘文件包括文本文件和二进制文件。文章详细讲解了文件的打开和关闭,特别是各种读写函数的用法,如fputc、fgetc、fputs、fgets、fprintf、fscanf、fwrite和fread。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

条件编译

#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;
}

`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值