嵌入式学习Day17 linux高级编程 -- 输入输出
1.fputc
格式:
int fputc(int c, FILE *stream);
功能:
向流中写入一个字符
参数:
c:写入字符的ASCII码值
stream:文件流指针
返回值:
成功返回写入字符的ASCII码值
失败返回EOF
注意:
1.fputc只能写入一个字符,写入多个字符需要多次调用fputc
2.fputc只能写入字符
练习: 1.利用fputc向文件file.txt中写入字符串"hello world"
2.搜索fgetc的功能,参数,返回值含义,实现读取文件中所有的内容并显示在界面上
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
char tmpbuff[32] = {"hello world"};
char *pstr = NULL;
fp = fopen("file.txt", "w");
if (NULL == fp)
{
perror("fail to fopen");
return -1;
}
pstr = tmpbuff;
while (*pstr != '\0')
{
fputc(*pstr, fp);
pstr++;
}
fclose(fp);
return 0;
}
2.fgetc
格式:
int fgetc(FILE *stream);
功能:
从流中读取下一个字符
参数:
stream:文件流指针
返回值:
成功返回读到字符的ASCII码值
失败返回EOF
读到文件末尾返回EOF
练习:
1.用fgetc从一文件中读取一个字符
2.编写程序统计文件的行数
//练习1
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
char ch = 0;
fp = fopen("file.txt", "r");
if (NULL == fp)
{
perror("fail to fopen");
return -1;
}
while (1)
{
ch = fgetc(fp); //要读取第二个字符还是用该语句,第几个都是,遵循顺序原则
if (EOF == ch)
{
break;
}
printf("ch = %c\n", ch);
}
fclose(fp);
return 0;
}
//练习2
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
char ch = 0;
int cnt = 0;
fp = fopen("file.txt", "r");
if (NULL == fp)
{
perror("fail to fopen");
return -1;
}
while (1)
{
ch = fgetc(fp);
if (EOF == ch)
{
break;
}
if ('\n' == ch)
{
cnt++;
}
}
fclose(fp);
printf("cnt = %d\n", cnt);
return 0;
}
2.fgetc/fputc与getchar/putchar的区别(基本无区别)
char ch = 0;
ch = getchar();
ch = fgetc(stdin);char ch = 'a'
putchar(ch);
fputc(ch, stdout);
练习:实现将一个文件中的内容拷贝到另一个文件中
#include <stdio.h>
int main(void)
{
FILE *fsrc = NULL;
FILE *fdst = NULL;
char tmp = 0;
fsrc = fopen("src.txt", "r");
if (NULL == fsrc)
{
perror("fail to fopen");
return -1;
}
fdst = fopen("dst.txt", "w");
if (NULL == fdst)
{
perror("fail to fopen");
return -1;
}
while (1)
{
tmp = fgetc(fsrc);
if (EOF == tmp)
{
break;
}
fputc(tmp, fdst);
}
fclose(fsrc);
fclose(fdst);
return 0;
}
3.fputs
格式:
int fputs(const char *s, FILE *stream);
功能:
向流中写入一个字符串
参数:
s:字符串首地址
stream:文件流指针
返回值:
成功返回非负数
失败返回EOF
练习:向一文件中写入一个字符串
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
char str[32] = {"hello world"};
fp = fopen("file.txt", "w");
if (NULL == fp)
{
perror("fail to fopen");
return -1;
}
fputs(str, fp);
fclose(fp);
return 0;
}
4.fgets
格式:
char *fgets(char *s, int size, FILE *stream);
功能:
从流中读取一个字符串
参数:
s:存放字符串空间首地址
size:最多读取字符的个数(包括函数自己最后在末尾自己添加的'\0')
stream:文件流指针
返回值:
成功返回存放字符串空间的首地址
失败返回NULL
读到文件末尾返回NULL
结束标志:
1.遇到'\n'读取后结束,并在结尾处增加'\0'
2.读满size个满结束
练习:从一文件中获取字符串
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
char tmpbuff[3] = {0};
fp = fopen("file.txt", "r"); //假设此时文件存在,里边有一串字符hello world
if (NULL == fp)
{
perror("fail to fopen");
return -1;
}
fgets(tmpbuff, sizeof(tmpbuff), fp); //因为sizeof()结果是3,且函数自带在文件末尾输入'\0'
printf("tmpbuff = %s\n", tmpbuff); //所以打印结果是he
fclose(fp);
return 0;
}
size_t //无符号的long型
5.fwrite
格式:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
向流中写入nmemb个对象,每个对象size字节大小,在ptr指向的空间中
参数:
ptr:存放数据空间的首地址
size:每个数据对象的大小
nmemb:数据对象的个数
stream:文件流指针
返回值:
成功返回写入对象的个数
失败返回0
读到文件末尾返回0
练习:使用fwrite向文件中写入一个、多个对象
#include<stdio.h>
typedef struct student
{
char name[20];
char sex;
int age;
int score;
}stu_t;
int main()
{
FILE *fp = NULL;
// stu_t a = {"zhangsan",'m',13,66};
stu_t arr[] = {{"zhangsan",'m',13,66},{"lisi",'w',34,66},{"wangwu",'m',34,44},{"maliu",'w',23,43}};
fp = fopen("file.txt","w");
if(fp == NULL)
{
perror("fail open");
return -1;
}
// fwrite(&a,sizeof(stu_t),1,fp); //写入一个对象
fwrite(&arr,sizeof(stu_t),4,fp); //写入多个对象
//&arr取到了首元素地址,arr也是
fclose(fp);
return 0;
}
6.fread
格式:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
从流中读取nmemb个对象,每个对象size个字节,存放到ptr指向的空间中
参数:
ptr:存放读取内容空间首地址
size:读取对象的大小
nmemb:读取对象的个数
stream:文件流指针
返回值:
成功返回读到对象个数
失败返回0
读到文件末尾返回0
练习:
以结构体学生作为对象,使用fread进行读取
#include<stdio.h>
typedef struct student
{
char name[20];
char sex;
int age;
int score;
}stu_t;
#if 0
void showstu(stu_t tmpstu) //传值
{
printf("姓名:%s\n",tmpstu.name);
printf("性别:%c\n",tmpstu.sex);
printf("年龄:%d\n",tmpstu.age);
printf("分数:%d\n",tmpstu.score);
}
#endif
void showstu(stu_t* tmpstu) //传址
{
printf("姓名:%s\n",tmpstu->name);
printf("性别:%c\n",tmpstu->sex);
printf("年龄:%d\n",tmpstu->age);
printf("分数:%d\n",tmpstu->score);
}
int main()
{
int i = 0;
stu_t a;
stu_t s[4];
FILE *fp = NULL;
fp = fopen("file.txt","r");
if(fp == NULL)
{
perror("fail to opened!\n");
return -1;
}
#if 0
//读取一个对象
fread(&a,sizeof(stu_t),1,fp);
showstu(a);
#endif
#if 0
//读取多个对象(传值)
fread(s,sizeof(stu_t),4,fp);
for(i= 0;i < 4;i++)
{
showstu(s[i]);
}
#endif
#if 0
//读取多个对象(传址)
fread(s,sizeof(stu_t),4,fp);
for(i= 0;i < 4;i++)
{
showstu(s+i);
}
#endif
fclose(fp);
return 0;
}
练习:
利用fread和fwrite完成将src.jpg图片内容拷贝到dst.jpg图片中
char tmpbuff[4096];
#include<stdio.h>
int main()
{
char arr[4096] = {0};
FILE* fsrc = NULL;
FILE* fdest = NULL;
int r = 0;
fsrc = fopen("src.jpg","r");
if(fsrc == NULL)
{
perror("fail to fsrc\n");
return -1;
}
fdest = fopen("dest.jpg","w");
if(fdest == NULL)
{
perror("fail to fdest\n");
return -1;
}
#if 0
while(1)
{
r = fread(arr,sizeof(arr),1,fsrc); //读取1个对象,每个对象4096个字节
if(r == 0)
{
break;
}
fwrite(arr,sizeof(arr),1,fdest); //写1个对象,每个对象4096个字节
}
#endif
#if 0
//确保dest.jog文件和src.jog相比一个字节不多一个字节不少
while(1)
{
r = fread(arr,1,sizeof(arr),fsrc); //读取4096个对象,每个对象1个字节
if(r == 0)
{
break;
}
fwrite(arr,1,r,fdest); //写r个对象,每个对象1个字节
}
#endif
fclose(fsrc);
fclose(fdest);
return 0;
}
7.fprintf
格式:
int fprintf(FILE *stream, const char *format, ...);
功能:
将格式化字符串输出到stream指向的流中
注释:
fprintf的用法只是在printf的基础上在""(双引号)前边添加文件流指针,使要输出的内容输出在对应文件中
printf("hello world\n");
fprintf(stdout,"hello world\n");
printf("%d",a);
fprintf(fp,"%d",a);
8.fsancf
格式:
int fscanf(FILE *stream, const char *format, ...);
功能:
从流中读取格式化的字符串
注释:
fscanf的用法只是在scanf的基础上在""(双引号)前边添加文件流指针,从文件中读取原本要在键盘上输入的内容
练习:fscanf 具体功能的练习
#include<stdio.h>
int main()
{
FILE* fp = NULL;
int NUM1 = 0;
int NUM2 = 0;
fp = fopen("file.txt","r");
if(fp == NULL)
{
perror("fail to open file.txt");
return -1;
}
fscanf(fp,"NUM1 = %d NUM2 = %d",&NUM1,&NUM2); //此时fp所指的文件中的内容是NUM1 = 100 NUM2 = 200(除此以外的内容编译的时候均会报错)
fclose(fp);
printf("NUM1 = %d NUM2 = %d",NUM1,NUM2);
return 0;
}