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