C语言新建文件,向文件中输入内容并读出文件内容

c语言中的文件读写函数:
一、读写一个字符函数--函数fgetc(fp)和fputc(ch,fp)
二、读写一个字符串函数--fgets(char *str,int n,FILE *fp)和fputs(char *str,FILE *fp)
三、文件的格式化读写函数--fprintf(文件指针,格式化字符串,输出列表)和fscanf(文件指针,格式化字符串,输入列表)
四、用二进制方式向文件读写一组数据--fread(buffer,size,count,fp)和fwrite(buffer,size,count,fp)

下面一一介绍:

一、读写一个字符函数--函数fgetc()和fputc()
调用形式分别为: ch=fgetc(fp); fputc(ch,fp); fgetc()函数将fp指向的文件的一个字符读到内存,赋给字符变量ch.如果遇文件结束符时,函数返回值为1. 
例:从键盘输入一些字符逐个送入磁盘,直到#为止。再将此盘文件读入内存,逐个显示在光屏。
# include <stdio.h>

int main( )
{
    FILE *fp;
    char ch,filename[10];
    scanf("%s",filename); /*读入磁盘文件名*/
    if((fp=fopen(filename,"w"))==NULL) /*建立新文件 */
    {
        printf("cannot open file\n"); /*建立新文件出错误信息*/
        exit(1); /*终止调用过程、关闭所有文件*/
    }
    ch=getchar( ); /*从键盘读入一个字符*/
    while(ch!='#') /*读到#时停止输入*/
    {
        fputc(ch,fp); /*将ch内字符写入fp指向的文件*/
        ch=getchar( );
    }
    fclose(fp); /*关闭fp所指向的文件*/
    if((fp=fopen(filename,"r"))==NULL) /*将filename 以'r'方式打开*/
    {
        printf("cannot open file\n");
        exit (1);
    }
    ch=fgetc(fp); /*从fp指向的文件读一个字符给ch变量 */
    while(ch!=EOF) /*读到文件结束符EOF时结束 */
    {
        putchar(ch);
        ch=fgetc(fp);
    }
    fclose(fp); /*关闭文件*/
    return 0;
}



二、读写数据块函数--fread( )和fwrite( )函数
调用方式分别为:
(1) 、fread(buffer,size,count,fp); 该函数将fp指向的文件的数据以数据块的形式读入内存buffer
(2)、write(buffer,size,count,fp);该函数将内存buffer的内容以数据块的形式写入fp指向的文件。
 其中:buffer:是一个指针。对于fread来说 它是读入数据的有效地址。对 fwrite来说,是要写盘的数据地址(起始地址)。 size:要读写的字节数。count:要进行读写多少个size字节的 数据项。 fp:文件型指针 如果fread或fwrite调用成功,则函数返回值为count的值。 若文件以二进制形式打开,用fread和fwrite函数就可以读写任何类型的信息。如: fread(f,4,2,fp); f为实型数组名,4表示个实型变量占4个字节,2表示读入2次,fp向的文件数据. 
例:从键盘输入4个学生的有关数据,然后把它们转存到磁盘文件上去。

#include<stdio.h>
#define SIZE 4

struct student_type
{
    char name[10];
    int num;
    int age;
    char addr[15];
}stud[SIZE];
void save();/*保存输入数据到文件的函数声明*/
void output();/*输入文件内容的函数声明*/

/*在主函数main( )中的终端读入4个学生的数据,然后调用save( )函数。*/
int 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();
    printf("**********************************\n");
    printf("这是刚才写到文件里的内容\n");
    output();
    return 0;
}
/*save( )函数,将数据送到"stu_list"磁盘文件中去。*/
void save()
{
    FILE *fp;
    int i;
    if((fp=fopen("stu_list","wb"))==NULL)
    {
        printf("cannot open file\n");
        return;
    }
    /*函数sizeof 计算一个结构体student_type的变量长度29(10+2+2+15)字节*/
    for(i=0;i<SIZE;i++)
        if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)
            printf("file write error\n");
}
void output()
{
    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);
    }
}



三、格式化读写函数--fscanf( )函数和fprint( )函数
调用方式分别是: fscanf(文件指针,格式字符串,输入表);
fscanf 函数将指针指向的文件内容,以格式符要求的形式,读入内存指定地址内 fprintf(文件指针,格式字符串,输出表);fprintf 函数是将内存指定地址内的内容,以格式符要求的形式,输出到指针指向的文件
说明: 以上两个函数与scanf( ) 和printf( )函数 只有一点不同:即前二者的读写对象是磁盘数据文件,即是文件指针指向的磁盘文件。 用fscanf( )和fprintf( )函数对磁盘文件 进行读写,使用方便,容易理解,但是,由于输入是要将ASCII码转换为二进制形式,输出时又要将二进制形式转换成字符,花费时间较多。因此,在内存与磁盘频繁交换数据的情况下,最好不用fscanf( )和fprintf( )函数,而用fread和fwrite函数。

例:编制一个程序,建立一个电话簿,包括姓名和电话号码两项内容,该程序有增加新姓名和电话号码的功能,也可以根据姓名查询已经存入电话簿的电话号码。
程序在设计时将分别设计成三个函数:
1.菜单选项--menu( )
2.增加新电话号码--add-num( )
3.查询老电话号码--lookup( )。

#include<stdio.h>
#include<stdlib.h>
#include <ctype.h>
#include<string.h>
#include<conio.h>
void add_num( ),lookup( );
char menu();




int main( )
{
    char choice;
    do
    {
        choice=menu( );
        switch(choice)
        {
            case 'a':
                add_num( );
                break;
            case 'l':
                lookup( );
                break;
        }
    }while(choice!='q');
    return 0;
}
char menu( )
{
    char ch;
    do{
        printf("(A)dd,(L)ookup or (Q)uit:");
        ch=tolower(getche( ));/*从键盘读取一个数据,小写字母不做处理,大写字母转换成小写字母*/
        printf("\n");
      }while(ch!='q'&&ch!='a'&&ch!='l');
    return ch;
}
void add_num( )
{
    FILE * fp;
    char name[80];
    int num;
    if((fp=fopen("phone","a"))==NULL)
    {
        printf("cannot open directory file\n");
        exit(1);
    }
    printf("enter name and number:");
    fscanf(stdin,"%s %d",name,&num);/*从输入流中读取数据到name和num*/
    fscanf(stdin,"%*c");/*接收键盘敲回车后的换行符*/
    fprintf(fp,"%s %d\n",name,num);/*将name和num信息写入文件中*/
    fclose(fp);
}
void lookup( )
{
    FILE *fp;
    char name[80],name2[80];
    int num;
    if((fp=fopen("phone","r"))==NULL)
    {
        printf("cannot open directory file\n");
        exit(1);
    }
    printf("name?");
    gets(name);/*获取屏幕输入的字符串*/
    while(!feof(fp))/*判断是否到文件结尾处*/
    {
        fscanf(fp,"%s%d",name2,&num);/*从文件中读取数据到name2和num变量中*/
        if(!strcmp(name,name2))/*比较输入的字符串是否和文件中的字符串相等*/
        {
            printf("%s: %d\n",name,num);
            break;
        }
    }
    fclose(fp);
}






请运行程序,可以得到如下结果:
(A)dd,(L)ookup or (Q)uit:A Enter name and number: Liming 6789 1234 135
(A)dd,(L)ookup or (Q)uit:A Enter name and number: Lihung 5678 235 357
(A)dd,(L)ookup or (Q)uit:L name?Liming Liming:(6789)1234-135 
(A)dd,(L)ookup or (Q)uit:Q
四、读入整型量函数--- getw( )函数和putw( )函数
调用方式如下例:
i=getw(fp);     它的作用是从磁盘文件读一个整数到内存,赋给整型变量i。
putw(10,fp);    它的作用是将整数10输出到fp指向的文件。
五、读写字符串函数-- fgets( )函数和fputs( )函数
调用方式分别为:
fgets(字符数组,n,fp);
fgets( )函数的作用是将fp指向的文件中(n-1)个字符读入字符数组,并且加结束符“\0”,若在(n-1) 个字符前遇到EOF或换行符,均结束读入。
fputs(字符数组,fp);
fputs( )函数的作用是向指定的文件输出一个字符串。如:fputs(“china”,fp);
说明:fgets( )和fputs( )函数与gets( )和puts( )函数的不同之处也在于:前二者的读写对象为指定的文件。
例子:从键盘读入若干个字符串,对它们按照字母顺序排序,然后把它们送到磁盘文件中保存。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    FILE *fp;
    char str[3][10],temp[10];
    int i,j,k,n=3;

    printf("enter strings:\n");
    for(i=0;i<n;i++)/*将输入的字符串存入字符数组中*/
        gets(str[i]);

    for(i=0;i<n-1;i++)/*用选择法对字符串进行排序*/
    {
        k=i;
        for(j=i+1;j<n;j++)
            if(strcmp(str[k],str[j])>0)
                k=j;
        if(k!=i)
        {
            strcpy(temp,str[i]);
            strcpy(str[i],str[k]);
            strcpy(str[k],temp);
        }
    }

    if((fp=fopen("string.txt","w"))==NULL)
    {
        printf("cannot open file!\n");
        exit(0);
    }

    for(i=0;i<n;i++)/*将字符数组中的字符串存储到硬盘的文件中*/
    {
        fputs(str[i],fp);
        fputs("\n",fp);
    }
    fclose(fp);
    
    printf("save in file:\"string.txt\"\n");
    printf("Read from file\n");
    printf("\nThe new sequence:\n");
    if((fp=fopen("string.txt","r"))==NULL)
    {
        printf("cannot open the file!\n");
        exit(0);
    }
    i=0;
    while(fgets(str[i],10,fp)!=NULL)/*将文件读出*/
        printf("%s",str[i++]);
    return 0;
}


 六、用户自定义读写函数
如果用户对于读写盘文件还有特殊的要求,或者是在某些C编译的库函数中,不包括前面所介绍的那些读写函数,用户也可以自己定义函数。
比如:定义getw函数
getw(fp)
{FILE *fp;
char *s; int i;
s=&i;
s[0]=getc(fp); s[1]=getc(fp);
return(i);
}

定义putw函数
putw(i,fp)
{int i;
FILE *fp;
{char *s;
s=&i;
putc(s[0],fp);putc(s[1],fp);
return(i);
}

七、常见的文件读、写错误
1. 使用文件时忘记打开文件。用后又忘记关闭文件,造成文件的数据丢失。
2. 混淆文件指针与文件读/写的位置指针的概念。
3. 不明确当前位置指针的位置,造成读/写错误。
4. 不能使文件正确定位。
5. 文件的打开与使用方式不匹配。
例如,对文件以只读方式打开,却对文件进行读写,请看程序:
if((fp=fopen(“test”,“r”))==NULL)
{printf(“cannot open this file\n”);
exit(1);
}
ch=fget(fp);
while(ch!=‘#’)
{ch=ch+4;
fputc(ch,fp);
ch=fget(fp);
}

以上程序段的“r”应改作“r+”。





  • 14
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值