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;
    }
    
  • 相关阅读:
    PHP原生实现,校验微信公众号||小程序服务器地址
    TP3.2校验微信公众号||小程序 服务器地址
    【微信小程序】解决 竖向<scroll-view>组件 “竖向滚动页面出现遮挡”问题
    【微信小程序】:confirm(删除提示)
    【微信小程序】:评论、回复和删除功能 -- 2017/7/14
    微信小程序:bindtap方法传参
    TP3.2之WHERE组合条件处理
    Python:导入numpy报错 No module named numpy
    Python: 二进制、八进制、十六进制转换或者输出
    Python:数字的格式化输出
  • 原文地址:https://www.cnblogs.com/raiuny/p/14641807.html
Copyright © 2011-2022 走看看