Loading

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 函数遇到'\0'后会停止读入,返回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("\n");
    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\n",buf[j].age,buf[j].name,buf[j].gender?"男":"女");
        fprintf(fpWrite,"age:%d name:%s gender:%s\n",buf[j].age,buf[j].name,buf[j].gender?"男":"女"); //结构化数据输出
        j++;
    }
    printf("\n");
    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;
}
posted @ 2021-07-12 00:12  raiuny  阅读(496)  评论(0编辑  收藏  举报