标c下文件操作的内容(2)实例分析

代码例子:
1.打开文件并写入数据;
/*
定义一个文件指针 FILE* file
打开文件 a.txt 给以 写权限 w+,向文件中写数据从文件头开始,
如果文件事先不存在则临时创建文件,否则先删除文件再打开,
这里就需要看你是准备如何用你的这个文件了,如果是保存的话,最好加上a
*/
#include<stdio.h>
#include<stdlib.h>

int main()
{
FILE* fd=fopen("a.txt","w+");
if(fd == NULL)
{
perror("fopen"),exit(-1);
}
int i;
i=0;
int res = fwrite(&i,4,1,fd);
printf("res = %d \n",res);
fclose(fd);
}

2.读文件内的数据,并打印
如果直接用一个int型的变量来读取数据;
#include<stdio.h>
#include<stdlib.h>

int main()
{
FILE* file=fopen("a.txt","r+");
if(file == NULL)
{
perror("fopen"),exit(-1);
}
int i;
fread(&i,4,1,file);
printf("i=%d\n",i);
fclose(file);
}

root@aiyq195-virtual-machine:/home/aiyq195/桌面/uc/bk# vi fr.c
root@aiyq195-virtual-machine:/home/aiyq195/桌面/uc/bk# gcc fr.c -o fr
root@aiyq195-virtual-machine:/home/aiyq195/桌面/uc/bk# ./fr
i=0


例子3:输入字符串,并查看文件内数据
#include <stdio.h>
#include <stdlib.h>
#include<string.h>

int main(){
FILE* file = fopen("a.txt","w");
if(file == NULL) perror("fopen"),exit(-1);
int i;
char cr[14];
memset(cr,0x00,sizeof(cr));
strncpy(cr,"nihaozhongguo",13);
fwrite(cr,sizeof(cr),1,file);
printf("cr=%s\n",cr);
fclose(file);
}

root@aiyq195-virtual-machine:/home/aiyq195/桌面/uc/bk# vi fw1.c
root@aiyq195-virtual-machine:/home/aiyq195/桌面/uc/bk# gcc fw1.c -o fw1
root@aiyq195-virtual-machine:/home/aiyq195/桌面/uc/bk# ./fw1
cr=nihaozhongguo
root@aiyq195-virtual-machine:/home/aiyq195/桌面/uc/bk# ls
a.txt fr fr1 fr.c fw fw1 fw1.c fw.c
root@aiyq195-virtual-machine:/home/aiyq195/桌面/uc/bk# cat a.txt
nihaozhongguo

例子4:读取文件内的数据,并在后面添加数据
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
FILE* file=fopen("a.txt","ar+");
if(file == NULL)
{
perror("fopen"),exit(-1);
}
char buf[100];
int res=fread(&buf,sizeof(buf),1,file);
printf("res=%d\n",res);
printf("buf=%s\n",buf);
res = fwrite(&buf,sizeof(buf),1,file);
printf("res=%d\n",res);
printf("buf=%s\n",buf);

fclose(file);
}

root@aiyq195-virtual-machine:/home/aiyq195/桌面/uc/bk# ./fr1
res=0
buf=nihaozhongguo
res=1
buf=nihaozhongguo
root@aiyq195-virtual-machine:/home/aiyq195/桌面/uc/bk# cat a.txt
nihaozhongguonihaozhongguo???/L????x????????x???????%?a?p?{???


上面产生了乱码,因为我传字符串,应该用strlen应该会好点;

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
FILE* file=fopen("a.txt","ar+");
if(file == NULL)
{
perror("fopen"),exit(-1);
}
char buf[100];
int res=fread(&buf,sizeof(buf),1,file);
printf("res=%d\n",res);
printf("buf=%s\n",buf);
res = fwrite(&buf,strlen(buf),1,file);
printf("res=%d\n",res);
printf("buf=%s\n",buf);

fclose(file);
}
这下变得确定了

root@aiyq195-virtual-machine:/home/aiyq195/桌面/uc/bk# ./fr2
res=1
buf=nihaozhongguo
res=1
buf=nihaozhongguo
root@aiyq195-virtual-machine:/home/aiyq195/桌面/uc/bk# cat a.txt
nihaozhongguonihaozhongguo???/L????x????????x???????%?a?p?{???nihaozhongguoroot

注意:使用文件读写的函数时,如果你要的是文件的有效数据,最好是直接使用strlen函数去判断他的
长度,而sizeof去读取他的内容;


例子5:
ftell函数的应用
#include <stdio.h>
#include<string.h>

int main(void)
{
FILE* fb = fopen("a.txt", "w+");
fprintf(fb, "This is a test");
printf("The file pointer is at byte \%ld\n", ftell(fb));
fclose(fb);
return 0;
}

[root@aiyq195 bc]# vi ftell.c
[root@aiyq195 bc]# gcc ftell.c -o ftell
[root@aiyq195 bc]# ./ftel
bash: ./ftel: No such file or directory
[root@aiyq195 bc]# ./ftell
The file pointer is at byte 14
[root@aiyq195 bc]# cat a.txt
This is a test

ftell例子2
ftell一般用于读取文件的长度,下面补充一个例子,读取文本文件中的内容:

#include <stdio.h>
#include <stdlib.h>

int main()
{
int flen;
char *p;
FILE *fp = fopen ("a.txt","r");
if(fp == NULL)
perror("fopen"),exit(-1);

fseek(fp,0L,SEEK_END); /* 定位到文件末尾 */
flen=ftell(fp); /* 得到文件大小 */
printf("ftell(fb) = %d\n",flen);
p=(char *)malloc(flen+1); /* 根据文件大小动态分配内存空间 */
if(p==NULL)
{
fclose(fp);
return 0;
}

fseek(fp,0L,SEEK_SET); /* 定位到文件开头 */
fread(p,flen,1,fp); /* 一次性读取全部文件内容 */
p[flen]=0; /* 字符串结束标志 */
printf("%s",p);
fclose(fp);
free(p);
return 0;
}

[root@aiyq195 bc]# vi ftell1.c
[root@aiyq195 bc]# gcc ftell1.c -o ftell1
[root@aiyq195 bc]# ./ftell1
ftell(fb) = 14
This is a test


fprintf() 函数
fprintf是C/C++中的一个格式化写-库函数,位于头文件<stdio.h>中,其作用是格式化输出到一个流/文件中;函数原型为int fprintf( FILE *stream, const char *format, [ argument ]...),fprintf()函数根据指定的格式(format)向输出流(stream)写入数据(argument)。

函数完整形式: int fprintf(FILE *stream,char *format,[argument]);
fprintf()函数根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件. fprintf()只能和printf()一样工作. fprintf()的返回值是输出的字符数,发生错误时返回一个负值.

#include <stdio.h>
FILE *fb;
void main( void )
{
int i = 10;
double fp = 1.5;
char s[] = "this is a string";
char c = '\n';
fb = fopen( "a.txt", "w" );
fprintf( fb, "%s%c", s, c );
fprintf( fb, "%d\n", i );
fprintf( fb, "%f\n", fp );
fclose( fb );
system( "type fprintf.out" );
}
[root@aiyq195 bc]# vi fprintf.c
[root@aiyq195 bc]# gcc fprintf.c -o fprintf
[root@aiyq195 bc]# ./fprintf
[root@aiyq195 bc]# cat a.txt
this is a string
10
1.500000
也就是fprintf() 函数,是可以直接将一些数据,直接拷贝到提供了文件描述符的文件中;不错的一个函数;
fscanf() 函数
功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。
函数名: fscanf
功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。
也就是fscanf是一个按照格式将文件内的数据读取到指定的变量的函数;
用 法: int fscanf(FILE *stream, char *format,[argument...]);
int fscanf(文件指针,格式字符串,输入列表);
FILE *fp;
char a[];
int b;
double c;
fscanf(fp,"%s%d%lf",a,&b,&c)
返回值:整型,数值等于[argument...]的个数
#include <stdio.h>

FILE *stream;
void main( void )
{
long l;
float fp;
char s[81];
char c;
stream = fopen( "fscanf.out", "w+" );
if( stream == NULL )
printf( "The file fscanf.out was not opened\n" );
else
{
fprintf( stream, "%s %ld %f%c", "a-string",
65000, 3.14159, 'x' );
/* Set pointer to beginning of file: */
fseek( stream, 0L, SEEK_SET );
/* Read data back from file: */
fscanf( stream, "%s", s );
fscanf( stream, "%ld", &l );

fscanf( stream, "%f", &fp );
fscanf( stream, "%c", &c );
/* Output data read: */
printf( "%s\n", s );
printf( "%ld\n", l );
printf( "%f\n", fp );
printf( "%c\n", c );
fclose( stream );
}
}

[root@aiyq195 bc]# vi fscanf.c
[root@aiyq195 bc]# gcc fscanf.c -o fscanf
[root@aiyq195 bc]# ./fscanf
a-string
65000
3.141590
x

[root@aiyq195 bc]# cat fscanf.out
a-string 65000 3.141590x

转载于:https://www.cnblogs.com/aiyq195/p/6410118.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值