C语言 文件操作函数与标准输入输出流

打开和关闭文件(任何文件操作函数的前提)
·(fopen)FILE * fopen ( const char * filename, const char * mode );
· (fclose)int fclose ( FILE * stream );
(注:每次fclose完以后要将指针置为空指针,类似于动态内存开辟)
示例:

FILE* pw = fopen("test.txt","w");
    fclose(pw);
    pw = NULL;
    FILE* pr = fopen("test.txt","r");
    fclose(pr);
    pr = NULL;

(字符操作)
1.fgetc函数
格式:int fgetc ( FILE * stream );
示例:

FILE* pr = fopen("test.txt","r");
    char s = fgetc(pr);
    printf("%c",s);

2.fputc函数
格式:int fputc ( int character, FILE * stream );
示例:

FILE* pw = fopen("test.txt","w");
    char c = 'a';
    fputc(c,pw);
    fclose(pw);
    pw = NULL;
    FILE* pr = fopen("test.txt","r");
    char s = fgetc(pr);
    printf("%c",s);
    fclose(pr);
    pr = NULL;
    return 0;

(字符串操作函数)
1.fgets函数
格式:char * fgets ( char * str, int num, FILE * stream );
str指我们要将拷贝出来的用哪个指针接收
num指我们最多拷贝的字符个数
stream指我们的源文件
示例:

FILE* pw = fopen("test.txt","w");
    fputc('a',pw);
    fputc('b',pw);
    fputc('c',pw);
    fclose(pw);
    pw = NULL;
    
    FILE* pr = fopen("test.txt","r");
    char a[1024] = {0};
    fgets(a,1024,pr);
    printf(a);
    fclose(pr);
    pr = NULL;
    return 0;

2.fputs函数
格式:int fputs ( const char * str, FILE * stream );
指 把str指向的字符串拷贝到stream里
示例:

char arr[] = "abcdef";
FILE* pw = fopen("test.txt","w");
fputs(arr,pw);
fclose(pw);
pw = NULL;

关于标准输入输出流:
(即标准输入流指键盘,标准输出流指屏幕)
表示为stdin 和 stdout
当成上面的文件使用就行:

示例:

#include<stdio.h>
int main()
{
    char arr[1024] = {0};
    fgets(arr,1024,stdin);
    fputs(arr,stdout);
    return 0;
}

等同:

char arr[1024] = {0};
gets(arr);
puts(arr);

(gets 和puts 均指作用在标准输入/输出流上)

格式化的输入输出函数:
1.fprintf函数
先看看他和printf函数的比较:
fprintf:
int fprintf ( FILE * stream, const char * format, … );
printf:
int printf ( const char * format, … );
是不是只少了一个FILE*
其余都一样
因为原来printf()默认打印到标准输出流,也就是屏幕,而现在我们可以选择文件进行输出,也就是选择终点
示例:

#include<stdio.h>
struct S
{
	char a;
	int b;
	float c;
	char arr[100];
};
int main()
{
	FILE* pw = fopen("test.txt","w");
	struct S s1 = {'a',4,3.14,"abcdef"};
	printf("%c ,%d ,%f ,%s",s1.a,s1.b,s1.c,s1.arr);
	fprintf(pw,"%c ,%d ,%f ,%s",s1.a,s1.b,s1.c,s1.arr);
	fprintf(stdout,"%c ,%d ,%f ,%s",s1.a,s1.b,s1.c,s1.arr);
	fclose(pw);
	pw = NULL;
	return 0;
}

2.fscanf函数:
先来看看他和scanf的比较:
scanf:
int scanf ( const char * format, … );
fscanf:
int fscanf ( FILE * stream, const char * format, … );
是不是又是只在前面多了一个文件,即不只是从标准输入流(键盘)读取
示例:

#include<stdio.h>
struct S
{
    char a;
    int b;
    float c;
    char arr[100];
};
int main()
{
    struct S s1 = {0};
    FILE* pr = fopen("test.txt","r");
    fscanf(pr,"%c ,%d ,%f ,%s",&(s1.a),&(s1.b),&(s1.c),s1.arr);
    printf("%c %d %f %s",s1.a,s1.b,s1.c,s1.arr);
    fclose(pr);
    pr = NULL;
    return 0;
}

总结:
scanf/printf :是针对标准输入流/输出流的格式化输入输出语句

fprintf/fscanf: 是针对所有输入流输出流的格式化输入输出语句(到流里去,或者从流里读取)

sscanf/sprintf:
(到字符串里去,或从字符串里读)
sscanf:Read formatted data from string
格式:
int sscanf ( const char * s, const char * format, …);

sprintf:Write formatted data to string
格式:
int sprintf ( char * str, const char * format, … );

示例:

#include<stdio.h>
struct S
{
    char a;
    int b;
    float c;
    char arr[100];
};
int main()
{
    char buf[1024] = {0};
    struct S s1 = {'a',4,3.14,"abcdef"};
    sprintf(buf,"%c %d %f %s",s1.a,s1.b,s1.c,s1.arr);
    printf("%s",buf);
    struct S temp = {0};
    sscanf(buf,"%c %d %f %s",&(temp.a),&(temp.b),&(temp.c),temp.arr);
    printf("%c %d %f %s",temp.a,temp.b,temp.c,temp.arr);
    return 0;
}

关于二进制的读和写:

1.fwrite:Write block of data to stream
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
2.fread:Read block of data from stream
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
写到文件里,二进制储存,和读取二进制的文件,并转换成正常的

#include<stdio.h>
struct S
{
    char a;
    int b;
    char arr[100];
};
int main()
{
    FILE* pwb = fopen("test.txt","wb");
    struct S s1 = {'a',4,"abcdef"};
    struct S temp = {0};
    fwrite(&s1,sizeof(struct S),1,pwb);
    fclose(pwb);
    pwb = NULL;
    //注:这里要再开启一个文件,因为开启文件的方式不同
    FILE* prb = fopen("test.txt","rb");
    fread(&temp,sizeof(struct S),1,prb);
    printf("%c %d %s",temp.a,temp.b,temp.arr);
    fclose(prb);
    prb = NULL;
    return 0;
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值