C语言_文件

来源:互联网 发布:网络客服人员工作职责 编辑:程序博客网 时间:2024/05/24 15:42
#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 WIN32sprintf(cmd, "md %s", name);  // Windows#elsesprintf(cmd, "mkdir %s", name);  // Linux#endifprintf("cmd:%s\n", cmd);system(cmd);}void test7(){// 删除目录(Windows平台和Linux平台)char name[20], cmd[80];printf("请输入要删除的目录的名称:\n");gets(name);#ifdef WIN32sprintf(cmd, "rd /s /q %s", name);  // Windows#elsesprintf(cmd, "rm -rf %s", name);  // Linux#endifsystem(cmd);}int main(int argc, const char *argv[]){test7();return 0;}


0 0