1.fputs和fgets
1.fputs
int fputs(const char *s, FILE *stream);
功能:
向流中写入一个字符串
返回值:
成功返回非负数
失败返回EOF
#include<stdio.h>
int main(void)
{
FILE*fp = NULL;
char str[32] = {"hello world"};
fp = fopen("file.txt","w");
if(fp==NULL)
{
perror("fail to open");
return -1;
}
fputs(str,fp);
fputs("hello world",fp);
fclose(fp);
return 0;
}
2.fgets
char *fgets(char *s, int size, FILE *stream);
功能:
从流中读取一行字符串
返回值:
成功返回存放字符串空间首地址
失败或者读到文件末尾返回NULL
#include<stdio.h>
int main(void)
{
FILE*fp = NULL;
fp = fopen("file.txt","r");
char str[4096] = {0};
char * pstr = NULL;
if(NULL == fp)
{
perror("fail to open");
return -1;
}
while(1)
{
pstr = fgets(str,sizeof(str),fp);
if(pstr == NULL)
{
break;
}
printf("%s",str);
}
fclose(fp);
return 0;
}
2.fprintf()和fscanf()[格式化输入、输出]
int fprintf(FILE *stream, const char *format, ...);
功能:
向流中写入格式化字符串
int fscanf(FILE *stream, const char *format, ...);
功能:
从流中读取格式化字符串
#include<stdio.h>
int main(void)
{
FILE *fp = NULL;
FILE*fp1 = NULL;
int avg = 0;
int ret = 0;
int sum = 0;
int i = 0;
int a[3] = {0};
fp = fopen("score.csv","r");
fp1 = fopen("avgscore.csv","w");
if(NULL == fp)
{
goto err1;
}
if(NULL == fp1)
{
goto err2;
}
while(1)
{
ret = fscanf(fp,"%d,%d,%d",&a[0],&a[1],&a[2]);
if(ret == EOF)
{
break;
}
sum=a[0]+a[1]+a[2];
avg = sum/3;
fprintf(fp1,"%d\n",avg);
}
fclose(fp);
fclose(fp1);
return 0;
err1:
return -1;
err2:
fclose(fp1);
}
3.fread和fwrite
1.fwrite
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
向流中写入nmemb个对象,每个对象size个字节,在ptr指向的空间中存放
参数:
ptr:写入数据空间的首地址
size:每个对象的大小
nmemb:写入对象的个数
stream:文件流指针
返回值:
成功返回实际写入对象的个数
失败返回0
int main(void)
{
typedef struct student
{
char name[32];
char sex;
int age;
int score;
}stu_t;
FILE *fp = NULL;
int ret = 0;
stu_t a ={"张三",'m',18,65};
stu_t b = {"李四",'f',19,100};
fp = fopen("b.txt","w");
if(NULL == fp)
{
perror("fail to open");
}
fwrite(&a,sizeof(a),1,fp);
fwrite(&b,sizeof(b),1,fp);
fclose(fp);
return 0;
}
2.fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
从流中读取nmemb个对象,每个对象size个字节,在ptr指向的空间中存放
参数:
ptr:存放数据空间的首地址
size:每个对象的大小
nmemb:写入对象的个数
stream:文件流指针
返回值:
成功返回实际读取对象的个数
失败或者读到文件末尾返回0
#include<stdio.h>
typedef struct student
{
char name[32];
char sex;
int age;
int score;
}stu_t;
int main(void)
{
int i = 0;
FILE *fp = NULL;
fp = fopen("b.txt","r");
size_t nret = 0;
stu_t s[4];
if(NULL == fp)
{
perror("fail to open");
return -1;
}
nret = fread(s,sizeof(stu_t),4,fp);
for(i = 0;i < nret;i++)
{
printf("姓名:%s\n", s[i].name);
printf("性别:%c\n", s[i].sex);
printf("年龄:%d\n", s[i].age);
printf("成绩:%d\n", s[i].score);
}
fclose(fp);
return 0;
}
如上图,如果将图中的char name[32]中的32进行修改,printf将会产生乱码。因为在b,txt中是以一个结构体为44个字节的标准fwrite,但如果修改fread的读取字节,就会改变结果。