您的位置:首页 > 编程语言 > C语言/C++

C语言——文件读写2

2010-12-01 22:59 239 查看
ASCII文件和二进制文件的比较

ASCII文件便于对字符进行逐个处理,也便于输出字符。但一般占存储空间较多,而且要花费转换时间。二进制文件把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放,一个字节并不对应一个字符,不能直接输出字符形式。

根据文件类型的不同,C语言对文件的操作也不同。

1. 字符输入输出函数(fputc()和fgetc())

函数调用:
fputc ( ch,fp ) ;
函数功能:
将字符(ch的值)输出到fp所指向的文件中去。
返回值:
如果输出成功,则返回值就是输出的字符;如果输出失败,则返回一个EOF(代表-1).

putchar(ch)函数其实就是从fput()中派生出来的。putchar(ch)是在stdio.h文件中用预处理命令#define定义的宏:
#define putchar(c) fputs(c,stdout)

函数的调用
ch=fgets(fp)
函数功能:
从指定的文件读入一个字符,该文件必须是以读或读写方式打开的。
返回值:
读取成功一个字符,赋给ch。如果遇到文件结束符,返回一个文件结束标志EOF。

案例:从一个文本文件顺序读入字符并显示在屏幕上。

方法1.

ch=fgetc(fp);

while(ch!=EOF)

{

putchar(ch);

ch=fgetc(fp);

}

方法1具有局限性,当文本文件全文英文时,能保证一个字节对应一个字符,由于字符的ASCII码不可能出现-1,所以上面程序是可用的。但如果文件的读取是采用二进制方式的,那么读入某一个字节的二进制数据的值就可能是-1,而这又恰好是EOF的值。这就出现错误判断文件结束的情况。为了解决这个问题,我们需要用feof函数来判断文件是否真的结束。如方法2所示。

方法2.

while(!feof(fp))

{

ch=fgetc(fp);

putchar(ch);

}

例1,从键盘输入字符,将结果保存到磁盘中,直到遇见‘#’为止。

#include <stdlib.h>
#include <stdio.h>
void main(void)
{ FILE *fp; /*定义文件指针*/
char ch,filename[10];
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{ printf("cannot open file/n");
exit(0); /*终止程序*/
}
ch=getchar( ); /*接收接收执行在scanf语句最后输入的回车符*/
ch=getchar( ); /*接收输入的第一个字符*/
while(ch!='#')
{
fputc(ch,fp);putchar(ch);
ch=getchar();
}
putchar(10) /*向屏幕输出一个换行符*/
fclose(fp);
}
例2,将磁盘中的一个文件复制到另一个磁盘文件中。

#include <stdlib.h>
#include <stdio.h>
void main(int argc,char *argv[ ])
{ FILE *in,*out;
char ch;
if (argc!=3)
{ printf("You forgot to enter a filename/n");
exit(0);
}
if((in=fopen(argv[1],"r"))==NULL)
{ printf("cannot open infile/n");
exit(0);
}
if((out=fopen(argv[2],"w"))==NULL)
{ printf("cannot open outfile/n");
exit(0);
}
while(!feof(in)) fputc(fgetc(in),out);
fclose(in);
fclose(out);
}
以上程序是按文本文件方式处理的。也可以用此程序来复制一个二进制文件,只需将两个open函数中的“r”和“w”分别改为“rb”和“wb”即可。

2. 数据块读写函数(fread()和fwrite())

getc和putc函数可以用来读写字符。但是对于文件的非字符数据读写如何操作呢?例如向文件写入一个实数或一个结构体变量的值。这里就需要使用fread和fwrite函数了,它们对文件的操作是采用二进制方式的。

—般调用形式为:
fread (buffer,size,count,fp);
fwrite(buffer,size,count,fp);


参数说明:
buffer是一个指针。对fread 来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址(均指起始地址)。
size 要读写的字节数。
count 要进行读写多少个size字节的数据项。
fp文件型指针。

例1,从键盘输入4个float类型的数,并将它们保存到磁盘上,最后要求从磁盘上读取这些数据,并显示在屏幕上。
(1)写入磁盘
#include<stdio.h>
void main()
{
float f[4];
int i;
FILE *fp;
for(i=0;i<4;i++)
{
scanf("%f",&f[i]);
}
if((fp=fopen("test","wb"))==NULL)
{
printf("cannot open the file./n");
exit(0);
}
for(i=0;i<4;i++)
{
if(fwrite(&f[i],sizeof(float),1,fp)!=1)
{
printf("file write error!/n");
exit(0);
}
}
fclose(fp);
}
(2)从磁盘读

#include<stdio.h>
void main()
{
float f[4];
int i;
FILE *fp;
if((fp=fopen("test","rb"))==NULL)
{
printf("cannot open the file./n");
exit(0);
}
while(!feof(fp))
{
if(fread(&f[i],sizeof(float),1,fp)!=1)
{
exit(0);
}else{
printf("%f/n",f[i]);
i++;
}
}
fclose(fp);
}

例2,从键盘输入4个学生的有关数据,然后把他们存入磁盘文件,最后从磁盘文件读取并显示。

(1)保存到磁盘

#include <stdio.h>
#define SIZE 4
struct student_type
{ char name[10];
int num;
int age;
char addr[15];
} stud[SIZE]; /*定义结构*/
void save( )
{ FILE *fp;
int i;
if((fp=fopen("stu-list","wb"))==NULL)
{ printf("cannot open file/n");
return;
}
for(i=0;i<SIZE;i++) /*二进制写*/
if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)
printf("file write error/n"); /*出错处理*/
fclose(fp); /*关闭文件*/
}
main()
{ int i;
for(i=0;i<SIZE;i++) /*从键盘读入学生信息*/
scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);
save( ); /*调用save()保存学生信息*/
}
(2)从磁盘显示

#include <stdio.h>
#define SIZE 4
struct student_type
{char name[10];
int num;
int age;
char addr[15];
}stud[SIZE];
main( )
{int i;
FILE*fp;
fp=fopen("stu-list","rb");
for(i=0;i<SIZE;i++)
{fread(&stud[i],sizeof(struct student_type),1,fp);
printf("%/-10s %4d %4d %/-15s/n",stud[i].name,stud[i].num, stud[i]. age,stud[i].addr);

}
fclose (fp);
}

3. 用户自定义读取其他类型数据的函数

用fread和fwrite函数可以读写任何类型的数据。实际上,用户也可以自己定义一个函数实现对特定数据类型的读写。

例如,定义一个向磁盘文件写一个实数(用二进制方式打开文件)的函数putfloat:

void putfloat(float num,FILE *fp)

{
char s;
int count;
s = (char*)#
for(count = 0;count < 4;count++)
putc(s[count],fp);
}

4. fgets和fputs函数

函数作用:从指定文件读入一个字符串。
函数调用:fgets(str,n,fp); n为要求得到的字符,但只从如指向的文竹:输入n-1个字符,然后在最后加—个'/0'字符,因此得到的字符中共有n个字符,把它们放到字符数组str中。如果在读完n-1个字符之前遇到换行符或EOF,读人即结束。
返回值:
fgers函数返回值为str的首地址。

函数作用:
向指定的文件输出一个字符串。
函数调用:
fputs(“china”,fp);
把字符串“China"输出到ft指向的文件。fputs函数中第一个参数可以是字符串常量、字符数组名或字符型指针。字符串末尾的'/o'不输出。若输出成功,函数值为0;
返回值:
输入成功,返回值为0;
输入失败,返回EOF.
这两个函数类似以前介绍过的gets和puts函数,只是fgets和fputs函数以指定的文件作为读写对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: