6.26-2023
实习主要内容:
1.行缓存:
以下是几种常用的刷新缓存的方法:
//方法一:
/*//行缓存大于等于1024个字节,刷新缓存,就可以打印*/
/*如果小于1024,则不会显示字符,存在缓冲区中*/
#include <stdio.h>
int main()
{
int i;
for(i=0;i<=1024;i++)
{
printf("A");
}
while(1);
}
//方法二:
/*使用\n刷新缓存*/
#include <stdio.h>
int main()
{
printf("A");
//printf("A\n");
while(1);
}
//方法三:
/*使用刷新缓冲流函数*/
#include <stdio.h>
int main()
{
int i;
for(i=0;i<=8;i++)
{
printf("A");
}
fflush(stdout);
while(1);
return 0;
}
//方法四:
/*没有while(1);碰到return 0 程序结束也可以刷新*/
#include <stdio.h>
int main()
{
int i;
for(i=0;i<=8;i++)
{
printf("A");
}
return 0;
}
2.全缓存(对文件的操作)
#include <stdio.h>
int main()
{
int i;
for(i=0;i<=4095;i++)//全缓存超过4096个字节,刷新缓存。
{
printf("a");
}
while(1);
return 0;
}
3.不缓存(stderr)
#include <stdio.h>
int main()
{
fprintf(stderr,"today is 2023/6/26");//无缓存,stderr
while(1);
return 0;
}
4.文件操作(标准I/O)
读写文件的几种方式:r r+ w w+ a a+
1.通过fp指针操作读取已存在文件的内容
fgetc函数返回一个int类型,值为字符的Ascii值。
#include <stdio.h>
int main()
{
FILE *fp;
int val;
fp = fopen("log1","r+");//打开一个文件
if(fp == NULL)
{
perror("");
return -1;
}
val = fgetc(fp);//返回一个int类型
printf("val = %d\n",val);
fclose(fp);//关闭一个文件
return 0;
}
fputc用法
#include <stdio.h>
int main()
{
FILE *fp;
int val;
fp = fopen("log1","r+");//打开一个文件
if(fp == NULL)
{
perror("");
return -1;
}
// val = fgetc(fp);//按字符读
// printf("val = %d\n",val);
fputc(116,fp); //覆盖写流指针所指位置上的字符
//前面fgetc读取了的话,那么再覆盖写,指针应该在后一个位置上。
fclose(fp);//关闭一个文件
return 0;
}
循环中:使用fgetc按字符读,fputc向文件中写入一个字符。
#include <stdio.h>
int main()
{
int val;
while(1)
{
val = fgetc(stdin);//按字符读
if(val == EOF)
//ctrl + D读到文件末尾显示success
//读到文件末尾或者出现错误
{
perror("");
return -1;
}
fputc(val,stdout);//向文件中写入一个字符
}
return 0;
}
还可以fgetc gputc 图片:
#include <stdio.h>
void copy_jpg(FILE*fp1,FILE*fp2)
{
int val;
while(1)
{
val = fgetc(fp1);//按字符读
if(val == EOF)
{
break;
}
fputc(val,fp2);//向文件中写入一个字符
}
}
int main()
{
FILE *fp1,*fp2;
fp1 = fopen("picture.jpeg","r");
if(fp1 == NULL)
{
perror("");
return -1;
}
fp2 = fopen("copy.jpeg","w+");
if(fp1 == NULL)
{
perror("");
return -1;
}
copy_jpg(fp1,fp2);
fclose(fp1);
fclose(fp2);
return 0;
}
效果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J18L8JS6-1687830468982)(C:\Users\19413\AppData\Roaming\Typora\typora-user-images\image-20230626111134484.png)]
fgets,fputs用法:
#include <stdio.h>
int main()
{
char buf[32] = {0};
fgets(buf,sizeof(buf),stdin); //从标准输入读一个字符串(用户进行输入)
//printf("buf:%s\n",buf);
fputs(buf,stdout);//将字符串输出到指定的文件当中 其实也就相当于printf
return 0;
}
注意 gcc vim 可以用table键补齐,或者是箭头号快速写 table键补齐 补齐 补齐!!!
输出另一个文件里的一句字符串:
#include <stdio.h>
int main()
{
char buf[32] = {0};
FILE *fp;
fp = fopen("log1","r");
if(fp == NULL)
{
perror("");
return -1;
}
fgets(buf,sizeof(buf),fp); //从标准输入读一个字符串(用户进行输入)
//printf("buf:%s\n",buf);
fputs(buf,stdout);//将字符串输出到指定的文件当中 其实也就相当于printf
return 0;
}
fread,fwrite用法:
#include <stdio.h>
struct student
{
char name[32];
int id;
int score;
};
int main()
{
struct student stu1 = {"jack",1,80};
FILE *fp;
fp = fopen("log1","w+");
if(fp == NULL)
{
perror("");
return -1;
}
fwrite(&stu1,sizeof(stu1),1,fp);//按对象进行写入
return 0;
}
fwrite是C语言中的文件操作函数之一,用于向文件中写入数据。它的参数如下:
- 写入数据的首地址:void* buffer,指向将要写入数据的内存地址。
- 每个数据项的大小:size_t size,表示每次写入数据项的大小,以字节为单位。
- 写入数据项的个数:size_t count,表示要写入的数据项的个数。
- 要写入数据的文件指针:FILE* stream,指向要写入数据的文件流的指针。
e(&stu1,sizeof(stu1),1,fp);//按对象进行写入
return 0;
}
fwrite是C语言中的文件操作函数之一,用于向文件中写入数据。它的参数如下:
1. 写入数据的首地址:void* buffer,指向将要写入数据的内存地址。
2. 每个数据项的大小:size_t size,表示每次写入数据项的大小,以字节为单位。
3. 写入数据项的个数:size_t count,表示要写入的数据项的个数。
4. 要写入数据的文件指针:FILE* stream,指向要写入数据的文件流的指针。
函数的返回值是成功写入的数据项个数,如果返回值小于传入的count,则说明写入出现了错误。