C语言_文件

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

using namespace std;

void test1()
{
	// fscanf()
	// int fscanf(FILE *, const char *, ...)
	
	char str1[10] = {0};
	int num1 = 0;
	fscanf(stdin, "%s%d", &str1, &num1);
	printf("str1:%s, num1:%d\n", str1, num1);

	printf("-------------------------------\n");

	// scanf()
	// int scanf(const char *, ...)
	char str2[10] = {0};
	int num2 = 0;
	scanf("%s%d", &str2, &num2);
	printf("str2:%s, num2:%d\n", str2, num2);
}

void test2()
{
	// fputs()
	// int fputs(const char *, FILE *)
	const char str1[20] = "Hello World\n"; 
	fputs(str1, stdout);

	// puts()
	// int puts(const char *)
	const char str2[20] = "I Love the World\n";
	puts(str2);

}

void test3()
{
	// fgets()
	// char *fgets(char *str, int num, FILE *);
	char str1[20] = "";
	fgets(str1, sizeof(str1), stdin);
	printf(str1);

	// gets()
	// char *gets(char *str)
	char str2[20] = "";
	gets(str2);
	printf(str2);
}

void test4()
{
	// putchar()实际上是putc的宏
	// int putchar(int)
	// #define putchar(_c) putc((_c), stdout)
	putchar('a');

	// putc()实际上也是宏
	// int putc(int, FILE *);
	putc('a', stdout);

	// fputc()
	// int fputc(int c, FILE *);
	fputc('a', stdout);
}

void test5()
{
	// getchar()
	// int getchar()
	// #define getchar() getc(stdin)
	int ch1 = 0;
	ch1 = getchar();
	printf("ch1:%c\n", ch1);

	// getc()
	// int getc(FILE *)
	int ch2 = 0;
	ch2 = getc(stdin);
	printf("ch2:%c\n", ch2);

	// fgetc()
	// int fgetc(FILE *)
	int ch3 = 0;
	ch3 = fgetc(stdin);
	printf("ch3:%c\n", ch3);
}

void test6()
{
	// putw()
	// int putw(int w, FILE *)
	int w1 = 0;
	w1 = putw(97, stdout);

	// getw()
	// int getw(FILE *)
	int w2 = 0;
	w2 = getw(stdin);
	putw(w2, stdout);
}

void test7()
{
	// 非标准库函数
	// 非标准库函数在Windows平台下可以从键盘无回显地读取一个字符,无回显即输入时不显示输入的内容,不过要包含头文件conio.h,Linux平台下没有conio.h这个头文件,也没有这些函数

	// getch()
	// int getch()
	int c1 = 0;
	c1 = getch();
	printf("c1:%c\n", c1);

	// getche()
	// int getche()
	int c2 = 0;
	c2 = getche();
	printf("c2:%c\n",c2);
}

int main(int argc, const char *argv[])
{

	test7();


	return 0;
}


//***** 文件 *****
//***** 缓冲区和流 *****
void test1()
{
    // 缓冲区
    /*
    文件通常存储在硬盘中,为避免频繁地读写硬盘,在内存中预留了一定的存储空间,叫做缓冲区。
    有了缓冲区,数据不会立即写入到硬盘中,而是先进入缓冲区,等待缓冲区充满后,才一次性地写入硬盘。
    而从硬盘读取数据,则是一次性地读取足够的数据到缓冲区,使缓冲区充满,
    然后再逐个地将缓冲区中的数据送入程序中,并赋给程序中的各个变量或者直接参与运算。
    */

    // 流
    /*
    流其实是一个抽象的概念,它通常表示一个字节序列,流入程序的序列称之为输入流,从程序流出的序列称之输出流。
    假如无缓冲区,那么字节序列直接从程序中流入或者流出。
    假如有缓冲区,那么字节序列将先进入缓冲区,然后再流入程序或者流出到设备。
    程序员无须为每种输入/输出设备或者输入/输出缓冲区编写特定的输入/输出代码,只要将输入/输出视为连续的字节流即可
    其他的事情交给流函数或者操作系统来完成,它们会自动处理缓冲区,自动处理字节流与输入/输出设备之间的交互。
    */

    // C语言中的流
    /*
    C语言定义了一个结构体类型用来管理流,使流与设备和缓冲区之间建立连接。
    struct _iobuf
    {
        char *_ptr;     // 指向当前缓冲区内容的指针,每次后移一个字节
        int __cnt;      // 如果是输入缓冲区,代表缓冲区里还有多少个有效数据
        char *_base;    // 缓冲区的起始地址
        int _flag;      // 流的状态标识,即读写错误后者达到文件尾等标识
        int _file;      // 文件描述符,可使用fileno函数获得此文件的描述符
        int _charbuf;   // 双字节的缓冲,即缓冲大小仅为2个字节
        int _bufsiz;    // 缓冲区的大小
        char *tmpfname; // 临时文件名
    };
    */

    // FILE
    /*
    在VC6.0下面,将该流结构体声明为_iobuf,并使用typedef取了个别名为:FILE
    顾名思义,_iobuf是输入/输出缓冲区,而FILE是文件的意思,那么,也就是说,这个流类型既可以作为输入/输出缓冲区
    也可以作为文件的缓冲区
    在头文件stdio.h中定义了3个FILE结构变量,作为3个流,并分别定义了这3个流的结构体指针:stdin,stdout和stderr
    stdin 代表标准输入流的地址,与默认输入设备(键盘)相连
    stdout 代表标准输出流的地址,与默认输出设备(屏幕)相连
    stderr 代表标准错误输出的地址,与默认错误输出设备(屏幕)相连
    */
}

//***** 流结构体使用 *****
void test2()
{
    char x;
    printf("缓冲区里的有效数据:%d\n",stdin->_cnt);
    printf("指向缓冲区的指针:0x%p\n",stdin->_ptr);
    printf("缓冲区的起始地址:0x%p\n",stdin->_base);
    printf("缓冲区的大小为:%d\n",stdin->_bufsiz);
    printf("文件描述符:%d\n",stdin->_file);

    x = getchar();
    printf("从缓冲区中提取1个字符:%c\n",x);
    printf("缓冲区里的有效数据:%d\n",stdin->_cnt);
    printf("指向缓冲区的指针:0x%p\n",stdin->_ptr);
    printf("缓冲区的起始地址:0x%p\n",stdin->_base);
    printf("缓冲区的大小为:%d\n",stdin->_bufsiz);

    x = getchar();
    printf("从缓冲区中提取1个字符:%c\n",x);
    printf("缓冲区里的有效数据:%d\n",stdin->_cnt);
    printf("指向缓冲区的指针:0x%p\n",stdin->_ptr);
    printf("缓冲区的起始地址:0x%p\n",stdin->_base);
    printf("缓冲区的大小为:%d\n",stdin->_bufsiz);

    fflush(stdin);
    printf("从缓冲区中提取出1个字符:%c\n",x);
    printf("缓冲区里的有效数据:%d\n",stdin->_cnt);
    printf("指向缓冲区的指针:0x%p\n",stdin->_ptr);
    printf("缓冲区的起始地址:0x%p\n",stdin->_base);

    /*
    fflush()函数操作输入流stdin是微软的编译器对C标准的扩充,它只适用于window平台下的编译器
    而对于非window平台的编译器,需要使用__fpurge(stdin)来代替fflush(stdin)
    */
}




//***** 读取文件 *****
void test3()
{
    FILE *fp;
    char ch;
    char fileName[20];

    printf("请输入文件名及其路径:");
    scanf("%s",fileName);

    fp = fopen(fileName,"r");  // "r"指明是以"只读"方式打开文件
    if(fp == NULL)
    {
        printf("文件打开失败,没有此文件或者文件受损!\n");
        exit(0);
    }
    printf("文件打开成功,内容如下:\n");
    ch = fgetc(fp);
    while(!feof(fp))  // ch != EOF
    {
        putchar(ch);
        ch = fgetc(fp);
    }

    printf("\n");
    fclose(fp);  // 读取完毕,一定要关闭文件

    /*
    fgetc 函数每次只能读取一个字符
    */
}

//***** 写入文件 *****
void test4()
{
    FILE *fp;
    char ch;
    char fileName[20];

    printf("请输入文件名及其路径:");
    scanf("%s",fileName);

    fp = fopen(fileName,"w");  // "w"指明是以"只读"方式打开文件
    if(fp == NULL)
    {
        printf("文件打开失败,没有此文件或者文件受损!\n");
        exit(0);
    }
    printf("文件打开成功,开始写入:\n");
    ch = getchar();
    while(!feof(fp))  // ch != EOF
    {
        fputc(ch,fp);
        ch = getchar();
    }

    printf("\n");
    fclose(fp);  // 写入完毕,一定要关闭文件
}

//***** 一次性读取多个字符 *****
void test5()
{
    FILE *fp;
    char ch[4097];
    char fileName[20];

    printf("请输入文件名及其路径:");
    scanf("%s",fileName);

    fp = fopen(fileName,"r");
    if(fp == NULL)
    {
        printf("文件打开失败,没有此文件或者文件受损!\n");
        exit(0);
    }
    printf("文件打开成功,读取如下:\n");
    fgets(ch,sizeof(ch),fp);
    puts(ch);
    fclose(fp);

    /*
    fgets 函数可以一次读取多个字符
    fgets 函数从fp指向的文件中读取sizeof(ch)-1个字符,即4096个字符,然后在最后添加一个'\0'字符,使其成为一个字符串
    */
}

//***** 一次性读取全部字符 *****
void test6()
{
    FILE *fp;
    char ch[4097];
    char fileName[20];

    printf("请输入文件名及其路径:");
    scanf("%s",fileName);

    fp = fopen(fileName,"r");
    if(fp == NULL)
    {
        printf("文件打开失败,没有此文件或者文件受损!\n");
        exit(0);
    }
    printf("文件打开成功,读取如下:\n");
    while(fgets(ch,sizeof(ch),fp))
    {
        puts(ch);
    }
    fclose(fp);
}

//***** 一次性写入一个字符串 *****
void test7()
{
    FILE *fp;
    char fileName[20];

    printf("请输入文件名及其路径:");
    scanf("%s",fileName);

    fp = fopen(fileName,"w");    if(fp == NULL)
    {
        printf("文件打开失败,没有此文件或者文件受损!\n");
        exit(0);
    }
    printf("文件打开成功,开始写入:\n");
    fputs("Hello World!",fp);
    fclose(fp);

    printf("写入成功,关闭文件!\n");
}

//***** 格式化写入字符fprintf *****
void test8()
{
    FILE *fp;
    char ch;
    char fileName[20];

    printf("请输入文件名及其路径:");
    gets(fileName);

    fp = fopen(fileName,"w");
    if(fp == NULL)
    {
        printf("文件打开失败,没有此文件或者文件受损!\n");
        exit(0);
    }
    printf("文件打开成功,请输入一个字符:");
    scanf("%c",&ch);
    fprintf(fp,"%d",ch);
    fclose(fp);
}

//***** 格式化读取字符fscanf *****
void test9()
{
    FILE *fp;
    char ch;
    char fileName[20];

    printf("请输入文件名及其路径:");
    scanf("%s",fileName);

    fp = fopen(fileName,"r");
    if(fp == NULL)
    {
        printf("文件打开失败,没有此文件或者文件受损!\n");
        exit(0);
    }
    fscanf(fp,"%d",&ch);
    printf("读取的字符为:%c\n",ch);
    fclose(fp);
}

//***** 成块写入文件 *****
void test10()
{
    FILE *fp;
    char ch;
    char fileName[20];
    int price[6] = {10,11,12,13,14,15};
    int n;

    printf("请输入文件名及其路径:");
    scanf("%s",fileName);

    fp = fopen(fileName,"w");
    if(fp == NULL)
    {
        printf("文件打开失败,没有此文件或者文件受损!\n");
        exit(0);
    }
    n = fwrite(price,sizeof(price),1,fp);

    if(n != 1)
    {
        printf("文件写入出错!\n");
        exit(0);
    }
    printf("写入完毕!\n");
    fclose(fp);
}

//***** 成块读取文件 *****
void test11()
{
    FILE *fp;
    char ch;
    char fileName[20];
    int price[6] = {0};
    int n;

    printf("请输入文件名及其路径:");
    gets(fileName);

    fp = fopen(fileName,"r");
    if(fp == NULL)
    {
        printf("文件打开失败,没有此文件或者文件受损!\n");
        exit(0);
    }
    n = fread(price,sizeof(price),1,fp);

    if(n != 1)
    {
        printf("文件读取出错!\n");
        exit(0);
    }
    printf("读取完毕!n:%d\n",n);
    for(int i = 0; i < 6; i ++)
    {
        printf("%d\t",price[i]);
    }
    printf("\n");
    fclose(fp);
}

//***** 结构体读写文件 *****
#define N 3
    struct drug  // 药品
    {
        int num;  // 编号
        char name[20];  // 名称
        float price;  // 价格
    };

    struct drug w[N];
    struct drug r[N];

//***** 结构体写入文件 *****
void Save()
{
    FILE *fp;
    char fileName[20];
    int n;

    printf("请输入文件名及其路径:");
    gets(fileName);

    fp = fopen(fileName,"w");
    if(fp == NULL)
    {
        printf("文件打开失败,没有此文件或者文件受损!\n");
        exit(0);
    }

    for(int i = 0; i < N; i ++)
    {
        printf("请输入第%d个药品的编号:",i + 1);
        scanf("%d",&w[i].num);

        printf("请输入第%d个药品的名称:",i + 1);
        scanf("%s",w[i].name);

        printf("请输入第%d个药品的单价:",i + 1);
        scanf("%f",&w[i].price);
    }

    printf("开始往cxm.dat文件中写入数据...\n");
    for(int i = 0; i < N; i ++)
    {
        n = fwrite(&w[i],sizeof(struct drug),1,fp);
        if(n != 1)
        {
            printf("文件写入出错!\n");
            exit(0);
        }
    }

    printf("写入完毕!\n");
    fclose(fp);
}

//***** 结构体读取文件 *****
void Load()
{
    FILE *fp;
    char fileName[20];
    int n;

    printf("请输入文件名及其路径:");
    gets(fileName);

    fp = fopen(fileName,"r");
    if(fp == NULL)
    {
        printf("文件打开失败,没有此文件或者文件受损!\n");
        exit(0);
    }

    printf("文件cxm.dat打开成功,内容如下:\n");
    for(int i = 0; i < N; i ++)
    {
        n = fread(&r[i],sizeof(struct drug),1,fp);
        if(n != 1)
        {
            printf("文件读取出错!\n");
            exit(0);
        }
    }

    printf("%s\t\t%s\t\t%s\n","编号","名称","价格");
    for(int i = 0; i < N; i ++)
    {
        printf("%03d\t\t%s\t\t%.2f\n",r[i].num,r[i].name,r[i].price);
    }

    fclose(fp);
}

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

using namespace std;

void test1()
{
	// 文件打开方式
	// "r"(只读)   打开一个文本文件,只允许读数据,文件不存在则打开失败
	// "w"(只写)   打开一个文本文件,只允许写数据,文件不存在则创建,存在则删除后再创建
	// "a"(追加)   向文本文件尾部追加数据,文件不存在则创建,存在则追加

	// "rb"(只读)   打开一个二进制文件,只允许读数据,文件不存在则打开失败
	// "wb"(只写)   打开一个二进制文件,只允许写数据,文件不存在则创建,存在则删除后再创建
	// "ab"(追加)   向二进制文件尾部追加数据,文件不存在则创建,存在则追加

	// "r+"(读写)   打开一个文本文件,允许读和写,文件不存在则打开失败
	// "w+"(读写)   打开一个文本文件,允许读和写,文件不存在则创建,存在则删除后再创建
	// "a+"(读写)   打开一个文本文件,允许读和写,文件不存在则创建,存在则追加

	// "rb+"(读写)   打开一个二进制文件,允许读和写,文件不存在则打开失败
	// "wb+"(读写)   打开一个二进制文件,允许读和写,文件不存在则创建,存在则删除后再创建
	// "ab+"(读写)   打开一个二进制文件,允许读和写,文件不存在则创建,存在则追加
}

void test2()
{
	// 权限不够,打印出错误信息
	FILE *fp = NULL;
	char fileName[20] = "D:\\cxm.txt";
	fp = fopen(fileName, "w");
	if (fp == NULL)
	{
		perror("文件打开失败,错误原因");
		exit(0);
	}
	fputs("Hello World!", fp);
	fclose(fp);
}

void test3()
{
	// 读取出错,打印出错误信息
	FILE *fp = NULL;
	char fileName[20] = "D:\\cxm.txt";
	fp = fopen(fileName, "r");
	if (fp == NULL)
	{
		perror("文件打开失败,错误原因");
		exit(0);
	}
	printf("文件读取成功\n");
	rewind(fp);
	if (fputs("Hello World!", fp) == EOF)
	{
		if (feof(fp))
		{
			printf("写到文件尾!\n");
			clearerr(fp);
		}
		else if (ferror(fp))
		{
			printf("写文件出错!\n");
			clearerr(fp);
		}
	}
	fclose(fp);
}

void test4()
{
	// 文件改名
	char oldName[20] = "D:\\cxm.txt";
	char newName[20] = "D:\\test\\zqr.txt";
	if (rename(oldName, newName) == 0)
	{
		printf("改名成功!\n");
	}
	else
	{
		perror("改名失败, 失败原因");
	}
}

void test5()
{
	// 文件删除
	char oldName[20] = "D:\\test\\zqr.txt";
	if (remove(oldName) == 0)
	{
		printf("删除成功!\n");
	}
	else
	{
		perror("删除失败,失败原因");
	}
}

void test6()
{
	// 创建目录(Windows平台和Linux平台)
	char name[20], cmd[80];
	printf("请输入要创建的目录名及其路径:\n");
	gets(name);
#ifdef WIN32
	sprintf(cmd, "md %s", name);  // Windows
#else
	sprintf(cmd, "mkdir %s", name);  // Linux
#endif
	printf("cmd:%s\n", cmd);
	system(cmd);
}

void test7()
{
	// 删除目录(Windows平台和Linux平台)
	char name[20], cmd[80];
	printf("请输入要删除的目录的名称:\n");
	gets(name);
#ifdef WIN32
	sprintf(cmd, "rd /s /q %s", name);  // Windows
#else
	sprintf(cmd, "rm -rf %s", name);  // Linux
#endif
	system(cmd);
}

int main(int argc, const char *argv[])
{
	test7();
	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值