1.向文件中输出时间,并且是每一秒更新一次,按ctrl+c停止输出后,下次再运行./a.out会继续想文件中接着输出
#include
#include
#include
#include
int main(int argc,const char *argv[])
{
FILE *f;
//打开文件
if((f=fopen("./time.txt","a+"))==NULL)
{
perror("fopen error");
return -1;
}
//计算行数
char a[128];
int line=0;
while(fgets(a,sizeof(a),f)!=NULL)
{
if(a[strlen(a)-1]=='\n')
line++;
}
//写入时间
time_t t;
struct tm *date;
int sec = -1;
while(1)
{
time(&t);
date = localtime(&t);
if(sec!=date->tm_sec)//判断时间增加
{
fprintf(f,"%d:%4d-%02d-%02d %02d:%02d:%02d\n",++line,
date->tm_year+1900,date->tm_mon+1,date->tm_mday,
date->tm_hour,date->tm_min,date->tm_sec);
sec = date->tm_sec;
fflush(f); //刷新缓冲区
}
}
fclose(f);
return 0;
}
2.使用fread、fwrite完成两个文件的拷贝
#include
#include
#include
int main(int argc,const char *argv[])
{
FILE *fp1 = NULL,*fp2 = NULL;//fp1为源文件 fp2为目标文件
//从终端输入文件,打开文件
if((fp1 = fopen(argv[1],"r")) == NULL)
{
perror("f1 error");
return -1;
}
if((fp2 = fopen(argv[2],"w")) == NULL)
{
perror("f2 error");
return -1;
}
//复制文件
char a[20];
int teg;
while((teg=fread(a,1,sizeof(a),fp1))!=0)
{
fwrite(a,1,teg,fp2);
}
fclose(fp1);
fclose(fp2);
return 0;
}
3.1 fopen和fclose的使用
#include
int main(int argc, const char *argv[])
{
FILE *fp = NULL;//定义文件指针
//使用fopen打开一个文件
fp = fopen("./01text.txt", "w");
//判断是否打开成功
if(fp == NULL)
{
printf("open file error\n");
}else
{
printf("open file ok\n");
}
//关闭一个文件
if(fclose(fp)!=0)
{
printf("文件关闭失败\n");
}
return 0;
}
3.2错误码
#include
//#include //错误码所在的头文件
//#include
int main(int argc, const char *argv[])
{
FILE *fp; //定义一个文件指针
//以只读的形式打开文件
if((fp = fopen("./02test.txt", "r")) == NULL)
{
//strerror(errno); //将错误码转变成错误信息
//printf("%s\n", strerror(errno));
perror("fopen error");
return -1;
}
fclose(fp);
return 0;
}
3.3 fgetc和fputc的使用
#include
int main(int argc, const char *argv[])
{
//定义文件指针
FILE *srcfp, *dstfp;
//以只读的形式打开文件
if((srcfp=fopen(argv[1], "r")) == NULL)
{
perror("fopen error");
return -1;
}
//以只写的形式打开第二个文件
if((dstfp = fopen(argv[2], "w")) == NULL)
{
perror("fopen error");
return -1;
}
//定义容器存放读取的字符
char ch;
//循环从文件中读取数据
while((ch = fgetc(srcfp)) != EOF)
{
//将读取出来的数据放入第二个文件中
fputc(ch, dstfp);
}
//关闭文件
fclose(srcfp);
fclose(dstfp);
printf("拷贝成功\n");
return 0;
}
3.4 fgets和fputs的使用
#include
int main(int argc, const char *argv[])
{
//定义文件指针
FILE *srcfp, *dstfp;
//以只读的形式打开文件
if((srcfp=fopen(argv[1], "r")) == NULL)
{
perror("fopen error");
return -1;
}
//以只写的形式打开第二个文件
if((dstfp = fopen(argv[2], "w")) == NULL)
{
perror("fopen error");
return -1;
}
//定义容器存放读取的字符
char chi[20];
//循环从文件中读取数据
while(fgets(chi,srcfp) != NULL)
{
//将读取出来的数据放入第二个文件中
fputs(chi,dstfp);
}
//关闭文件
fclose(srcfp);
fclose(dstfp);
printf("拷贝成功\n");
return 0;
}
3.5缓冲区大小
#include
int main(int argc, const char *argv[])
{
//验证行缓存大小为1024字节
//如果没有使用缓存区,那么其大小为0
printf("行缓存的大小为:%ld\n", stdin->_IO_buf_end - stdin->_IO_buf_base);
//使用标准输入指针
char s[128];
fgets(s, sizeof(s), stdin);
printf("s = %s\n", s);
//当使用了该缓存区后,该大小为1024
printf("行缓存的大小为:%ld\n", stdin->_IO_buf_end - stdin->_IO_buf_base);
printf("行缓存的大小为:%ld\n", stdout->_IO_buf_end - stdout->_IO_buf_base);
//验证全缓存的大小
FILE *fp;
//打开文件
if((fp=fopen("./01test.txt", "w")) == NULL)
{
perror("fopen error");
return -1;
}
//向文件中写入数据
fputc('H', fp);
printf("全缓存的大小为:%ld\n", fp->_IO_buf_end-fp->_IO_buf_base);
//关闭文件
fclose(fp);
//验证不缓存的大小
fputs("error\n", stderr); //向标准出错中写入数据
printf("不缓存的大小为:%ld\n", stderr->_IO_buf_end-stderr->_IO_buf_base);
return 0;
}
3.6行缓存刷新时机
#include
int main(int argc, const char *argv[])
{
//当缓存区没有到刷新时机时,不会刷新缓存区
//printf("hello world");
//while(1);
//1、遇到换行符号时会刷新缓存区
//printf("hello world\n");
//while(1);
//2、程序结束后,会自动刷新缓存区
//printf("hello world");
//3、当关闭文件指针时,会刷新缓存区
//printf("hello world");
//fclose(stdout); //手动关闭标准输出文件指针
//while(1);
//4、当使用fflush函数刷新时,也会刷新缓存区
//printf("hello world");
//fflush(stdout); //手动刷新缓存区
//while(1);
//5、缓存区满了,也会刷新缓存区
//for(int i=0; i<1500; i++)
//{
// printf("A");
//}
//while(1);
//6、当输入输出发生切换时也会刷新缓存区
int num;
printf("请输入一个整数:");
scanf("%d", &num);
while(1);
return 0;
}
3.7 全缓存刷新时机
#include
int main(int argc, const char *argv[])
{
FILE *fp;
//打开文件
if((fp=fopen("./01test.txt", "w")) == NULL)
{
perror("fopen error");
return -1;
}
//1、当遇到换行符号时,不会刷新全缓存
//fputs("hello world\n", fp);
//while(1);
//2、当程序结束后,会刷新全缓存
//fputs("hello world", fp);
//3、当关闭文件指针时,会刷新全缓存
//fputs("hello world", fp);
//fclose(fp);
//while(1);
//4、当使用fflush刷新时,会刷新全缓存
//fputs("hello world", fp);
//fflush(fp);
//while(1);
//5、当全缓存满了后,会刷新全缓存
//for(int i=0; i<5000; i++)
//{
// fputc('A', fp);
//}
//while(1);
//6、当输入输出切换时,会刷新全缓存
fputc('H', fp);
fgetc(fp);
while(1);
return 0;
}
3.8 输出时间
#include
#include //有关时间的头文件
int main(int argc, const char *argv[])
{
//定义时间类型,保存秒数
time_t sys_time;
//调用time函数,获取秒数
time(&sys_time);
//调用将秒数转变成时间指针
struct tm * t = localtime(&sys_time);
//输出获取的时间
printf("%4d-%02d-%02d %02d:%02d:%02d\n",\
t->tm_year+1900, t->tm_mon+1, t->tm_mday,\
t->tm_hour, t->tm_min, t->tm_sec);
return 0;
}
3.9 springtf和snprintf
#include
#include //有关时间的头文件
int main(int argc, const char *argv[])
{
//定义时间类型,保存秒数
time_t sys_time;
//调用time函数,获取秒数
time(&sys_time);
//调用将秒数转变成时间指针
struct tm * t = localtime(&sys_time);
//输出获取的时间
// printf("%4d-%02d-%02d %02d:%02d:%02d\n",\
t->tm_year+1900, t->tm_mon+1, t->tm_mday,\
t->tm_hour, t->tm_min, t->tm_sec);
char buf[128] = ""; //定义一个数组
/*
sprintf(buf,"%4d-%02d-%02d %02d:%02d:%02d\n",\
t->tm_year+1900, t->tm_mon+1, t->tm_mday,\
t->tm_hour, t->tm_min, t->tm_sec);
*/
snprintf(buf,sizeof(buf),"%4d-%02d-%02d %02d:%02d:%02d\n",\
t->tm_year+1900, t->tm_mon+1, t->tm_mday,\
t->tm_hour, t->tm_min, t->tm_sec);
printf("%s", buf); //输出时间
return 0;
}
3.10 fscanf和fprintf
#include
#include
int main(int argc, const char *argv[])
{
//定义文件指针
FILE *fp;
char userName[100];
char pwd[20];
//以只写的形式打开文件
if((fp=fopen("./06test.txt", "a")) == NULL)
{
perror("fopen error");
return -1;
}
//将账号和密码输入
printf("请输入注册账号:");
scanf("%s", userName);
printf("请输入密码:");
scanf("%s", pwd);
//将内容写入文件中
fprintf(fp, "%s %s\n", userName, pwd);
//关闭文件
fclose(fp);
printf("注册成功\n");
//再次以只读的形式打开文件
if((fp = fopen("./06test.txt", "r")) == NULL)
{
perror("fopen error");
return -1;
}
//定义变量接收登录账号和密码
char login[100], password[20];
printf("请输入登录账号:");
scanf("%s", login);
printf("请输入登录密码:");
scanf("%s", password);
while(fscanf(fp,"%s %s", userName, pwd) != EOF)
{
if(strcmp(userName,login)==0 && strcmp(pwd,password)==0)
{
printf("登录成功\n");
fclose(fp);
return 2;
}
}
printf("登录失败\n");
fclose(fp);
return 0;
}
3.11 feof、ferror的使用
#include
int main(int argc, const char *argv[])
{
FILE *fp;
//以只读的形式打开文件
if((fp=fopen("./01size.c", "r")) == NULL)
{
perror("fopen error");
return -1;
}
while(1)
{
char ch;
ch = fgetc(fp);
printf("%c", ch);
if(feof(fp))
{
printf("读到文件末尾\n");
break;
}else if(ferror(fp))
{
printf("读取文件失败\n");
break;
}
}
//关闭文件
fclose(fp);
return 0;
}
3.12 关于光标的函数(fseek、ftell、rewind)
#include
//定义结构体类型
struct Stu
{
char name[20];
int age;
double score;
};
int main(int argc, const char *argv[])
{
//定义文件指针
FILE *fp;
//以只写的形式打开文件
if((fp=fopen("./07test.txt", "w")) == NULL)
{
perror("fopen error");
return -1;
}
//定义两个结构体变量
struct Stu s[2] = {{"zhangsan", 18, 99}, {"lisi", 20, 88}};
//向文件中写入两个学生大小的数据
fwrite(s, sizeof(struct Stu), 2, fp);
//关闭文件
fclose(fp);
//以只读的形式打开文件
if((fp = fopen("./07test.txt", "r")) == NULL)
{
perror("fopen error");
return -1;
}
//以fread进行读取数据
struct Stu stu;
//要读取第二个学生信息
//定位光标
fseek(fp, sizeof(struct Stu) ,SEEK_SET);
int ret = fread(&stu, sizeof(struct Stu), 1, fp);
printf("姓名:%s, 年龄:%d, 分数:%lf\n", stu.name, stu.age, stu.score);
//fwrite(buf1, 1, ret, stdout);
//关闭文件
fclose(fp);
return 0;
}
3.13 以追加的形式打开文件,使用fseek函数移动光标,是否能够起效果
#include
int main(int argc, const char *argv[])
{
FILE *fp;
//以追加的形式打开文件
if((fp=fopen("./01test.txt", "a+")) == NULL)
{
perror("fopen error");
return -1;
}
//更新指针执行到开头
fseek(fp, 0, SEEK_SET);
fputs("hello world\n", fp); //向文件中写入数据
//char buf[128] = "";
//fgets(buf, sizeof(buf), fp);
// printf("buf = %s\n", buf);
//关闭文件
fclose(fp);
return 0;
}
4.打马赛克
#include
#include
#include
void aa(unsigned char t[],int p)
{
for (int i=0;i