zoukankan      html  css  js  c++  java
  • C文件读取

    二进制读取

    #include<stdio.h>
    int main()
    {
        FILE *fpRead = fopen("data/data.in","rb");
        FILE *fpWrite = fopen("data/data.o","wb");
        unsigned char buf[1000];
        int rc;
        while((rc = fread(buf,sizeof(unsigned char), 1, fpRead))!=0)
        {   // 1. 一次读写一个字节,也可以一次读写n个字节,但rc总小于等于n,表示实际读取的字节数
            // 2. fread 函数遇到''后会停止读入,返回rc,并buf余下的位置会补0,因此不用担心会报错的情况
            // 3. 在写入的时候也要给出写入多少个(rc),每一个数据有多少位(sizeof(typ)
            fwrite( buf, sizeof(unsigned char), rc, fpWrite );
            for(int i = 0; i < rc; i++)
            {
                printf("%x, ",buf[i]);
            }
        }
        printf("
    ");
        fclose(fpRead);
        fclose(fpWrite);
        return 0;
    }
    

    image
    data.in文件:按照一个字节一个字节输出(以十六进制的形式,读入时候读的是ASCII码)
    image

    fopen() 函数参数

    FILE *fp = fopen("D:\1.txt","rb+");
    // 以二进制的形式打开文件1.txt, 如果文件不存在则返回NULL。文件以读写方式打开,可以用fp指针修改或者读取。

    • r 只读方式
    • w 只写方式, 如果文件不存在则新建一个文件,如果文件存在,则清空文件重写
    • r+ 可读可写,如果文件不存在则返回NULL
    • w+ 可读可写,如果文件不存在则新建文件
    • a 追加方式,如果文件不存在则新建文件,如果文件存在则在末尾追加写入的数据
    • a+ 可读可写,写入的数据追加至末尾,如果文件不存在则新建文件
      后面默认为t,以文件格式读写;
      如果加上b,则以二进制文件读写(最小单位为字节,unsigned char)

    fread() 函数参数

    size_t fread(void *buf, size_t size, size_t num, FILE *stream)

    • buf 指向带有最小尺寸 size*nmemb 字节的内存块的指针, 用来存读入的数据
    • size 每个元素大小,以字节为单位
    • num 一次读取的元素个数
    • stream 指向FILE对象的指针,由fopen函数生成
      rc = fread(buf,sizeof(unsigned char), 10, fpRead))
      buf一次存入10个字节的数据,也可能由于文件缺失,只读了一部分,rc记录读入的元素个数,如果rc==0,说明读入完成。

    fscanf() 函数参数

    int fscanf(FILE * stream, const char * format, [argument...])

    • stream 指向FILE对象的指针,输入流(跟cin类似,指键盘上输入)fin则从文件输入,由fopen创建。
    • format 一次读入文件的格式,例如"%s %s %s %d"
    • [argument...] 读取的数据保存的位置, s0,s1,s2,&num
      返回读入参数的个数,读取失败则返回EOF(-1)

    按结构体读取文件

    #include<stdio.h>
    typedef struct Student{
        int age;
        char name[10];
        int gender;
    }Stu;
    int main()
    {
        FILE *fpRead = fopen("data/data.in","r");//将data.in文件存在data文件夹下
        FILE *fpWrite = fopen("data/data.o","w");
        Stu buf[1000]; //定义缓存区
        int j = 0;
        while((fscanf(fpRead,"%d,%d,%s",&buf[j].age,&buf[j].gender,buf[j].name))!=EOF) //结构化数据输入
        {
            printf("age:%d name:%s gender:%s
    ",buf[j].age,buf[j].name,buf[j].gender?"男":"女");
            fprintf(fpWrite,"age:%d name:%s gender:%s
    ",buf[j].age,buf[j].name,buf[j].gender?"男":"女"); //结构化数据输出
            j++;
        }
        printf("
    ");
        fclose(fpRead);
        fclose(fpWrite);
        return 0;
    }
    

    读取的文件

    12,1,Tom
    14,0,Sara
    12,1,Jack
    18,0,Kate
    

    输出:
    image

    其他输入输出函数(C语言)

    fgetc fputc

    int __cdecl fgetc(FILE *_File); //成功则返回获得的值,不成功则返回EOF
    
    int __cdecl fputc(int _Ch,FILE *_File); //成功则返回_ch, 不成功则返回EOF=-1
    

    fgets fputs

    int __cdecl fputs(const char * __restrict__ _Str,FILE * __restrict__ _File); //若成功返回非负值,若失败返回EOF
    char *__cdecl fgets(char * __restrict__ _Buf,int _MaxCount,FILE * __restrict__ _File); 如果成功返回一个指针;若出错返回null,需要定义_MaxCount一次最多获得多少个字节
    
    

    输入输出重定向,也可以解决大部分问题

    实例:代码如下: 将in.txt中的输入两两相乘然后输出到out.txt文件中

    如下为c语言写法:

    #include <stdio.h>
    int main()
    {
        int a, b;
        freopen("in.txt", "r", stdin);   //输入重定向,输入数据将从in.txt文件中读取
        freopen("out.txt", "w", stdout); //输出重定向,输出数据将保存在out.txt文件中
        while (scanf("%d %d",&a,&b)!=EOF)
        {
            printf("%d ",a*b);
        }
        fclose(stdin);  //关闭文件
        fclose(stdout); //关闭文件
        return 0;
    }
    

    也可以简单写如下代码:
    test.c文件:

    #include <stdio.h>
    int main()
    {
        int a, b;
        while (scanf("%d %d",&a,&b)!=EOF)
        {
            printf("%d ",a*b);
        }
        return 0;
    }
    

    在命令行输入
    g++ -o test test.c
    test.exe <in.txt> out.txt
    在命令行指定输入输出文件也可以实现上面的功能

    如下为C++写法

    #include<fstream>
    using namespace std;
    int main()
    {
        int a, b;
        ifstream inFile("in.txt");
        ofstream outFile("out.txt");
        while (inFile >> a >> b)
        {
            outFile << a + b << endl;
        }
      inFile.close();
      outFile.close(); 
        return 0;
    }
    
  • 相关阅读:
    Redis源代码分析(十三)--- redis-benchmark性能測试
    kvm中运行kvm
    umount.nfs device busy day virsh extend diskSpace, attachDisk
    ultravnc
    openNebula dubug
    maintenance ShellScripts
    virsh VMI deploy data serial xml
    cloud computing platform,virtual authentication encryption
    基于C 的libvirt 接口调用
    storage theory
  • 原文地址:https://www.cnblogs.com/raiuny/p/14641807.html
Copyright © 2011-2022 走看看