• 标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 ",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 ",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 ",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 ",res);
    printf("buf=%s ",buf);
    res = fwrite(&buf,sizeof(buf),1,file);
    printf("res=%d ",res);
    printf("buf=%s ",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 ",res);
    printf("buf=%s ",buf);
    res = fwrite(&buf,strlen(buf),1,file);
    printf("res=%d ",res);
    printf("buf=%s ",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 ", 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 ",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 = ' ';
    fb = fopen( "a.txt", "w" );
    fprintf( fb, "%s%c", s, c );
    fprintf( fb, "%d ", i );
    fprintf( fb, "%f ", 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 " );
    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 ", s );
    printf( "%ld ", l );
    printf( "%f ", fp );
    printf( "%c ", 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

  • 相关阅读:
    python 冒泡排序
    数组
    git用法
    Leetcode 344. 反转字符串
    Leetcode 83. 删除排序链表中的重复元素
    【第一部分】01Leetcode刷题
    【C++ Primer | 07】常用算法
    【第一部分】10Leetcode刷题
    【第一部分】09Leetcode刷题
    【第一部分】07Leetcode刷题
  • 原文地址:https://www.cnblogs.com/aiyq195/p/6410118.html
Copyright © 2020-2023  润新知