C语言的文件读取------C语言

本文介绍了C语言中进行文件操作的重要性,特别是当需要处理大量数据时。文章详细讲解了如何使用fopen()函数打开文件,fgetc()和fgets()函数进行数据读取,并提供了示例代码。还提到了文件操作的基本步骤,包括打开、读取和关闭文件,以及fread()函数的使用。
摘要由CSDN通过智能技术生成

首先我们为什么要学习文件操作呢?嗯哼?为了解决什么问题呢?

这是因为啊C语言本身没有输入输出的功能,一般都是调用库函数完成的。

比如大家对scanf()函数和printf()函数相当的熟悉,scanf()函数处理的输入数据来自键盘,printf()函数输出的数据流向显示器。

用C语言的行话来说,这两个函数处理的数据从stdin流入和stdout流出,stdin的数据一般是从键盘流入,stdout一般是流向显示器的。

但是键盘并不适合大数据的输入,此时我们便需要借助文件,文件具有保存数据的能力,大量数据的输入以及数据的持久保存一般是借助文件完成的。

这下应该明白了吧,比如有一个千万级的数据,大家总不能键盘一个一个输入吧,这要到猴年马月对不对。

接下来再问大家一个问题,把大象装入冰箱需要几步呢?

第一步,打开冰箱门,第二步把大象塞进去,第三步关闭冰箱门。太棒了,呜呜呜

文件操作也是如此,首先我们需要打开一个文件。打开一个文件的前提是需要准备一个文件。

 在项目路径下准备一个txt文件,记得把文件的字符集设置成ANSI。

所谓打开,在计算机里面一般是指打开内存与外存或其他设备之间的联系通道,好进行数据交换。

在C里面对文件进行读写的操作的指针的类型是FILE* 。每当我们要进行文件操作的时候都要定义这样的一个指针。让我们看看这个类型的定义。是一个结构体,里面的参数以后有机会讲。

typedef struct _iobuf
{
    char*    _ptr;
    int    _cnt;
    char*    _base;
    int    _flag;
    int    _file;
    int    _charbuf;
    int    _bufsiz;
    char*    _tmpfname;
} FILE
然后我们就可以打开文件,打开文件需要一个函数,fopen()。

_CRTIMP FILE* __cdecl __MINGW_NOTHROW fopen (const char*, const char*);
有两个参数,第一个参数是将要操作的文件的名称,第二个参数是打开模式,一般有 r w a,r表示读,w表示写,a表示可读可写。

它还有返回值,如果文件打开失败,就会返回NULL。所以一般我们在打开文件的时候都要进行判定。

    //第一步打开文件
    FILE* file = fopen("test.txt", "r");
 
    //进行判定
    if (file == NULL)
    {
        printf("打开文件失败!!!");
        return 0;
    }
如果打开文件成功,我们就可以进行文件内容的读取了。

可以使用fgetc()函数,或者fgets()函数,大家应该知道这两者的区别,一个是一个一个读,一个是一行一行读。这两个函数还有个特点就是用过以后,会自动把指针往后移,不用手动移动了。

接下来我们可以试试。但是,由于char是一个字节,而中文一般是两个字节,所以我们输出中文的话需要输出两个字节,像这样。

    char ch,ch1;
    ch = fgetc(file);
    ch1 = fgetc(file);
    printf("%c%c", ch, ch1 );


这就读到了第一个字符,我们多读几个看看。

    char ch,ch1;
    ch = fgetc(file);
    ch1 = fgetc(file);
    printf("%c%c", ch, ch1 );
    ch = fgetc(file);
    ch1 = fgetc(file);
    printf("%c%c", ch, ch1);
    ch = fgetc(file);
    ch1 = fgetc(file);
    printf("%c%c", ch, ch1);


非常的成功,但是这样写,特别的麻烦的说,所以我们可以选择循环读取,而且文件的结束都有一个EOF,可以通过这个判断有没有读完文件。

    char ch,ch1;
 
    while (EOF != (ch=fgetc(file)))
    {
        printf("%c", ch);
    }
 让我们看看读取的结果

非常的perfect。完美

接下来让我们再看看另一个函数fgets();按行读取

 有返回值,可以用来进行判断,第一个参数是数据要保存的位置,第二个读取的最大字节数,第三个指向文件的指针。上代码。

    char sentence[200] = {0};
 
    if(fgets(sentence,200,file) != NULL)
        printf("%s", sentence);


那么fgets()能不能连续读取呢?让我们试试。

    while(fgets(sentence,200,file) != NULL)
        printf("%s", sentence);


毫无意外的成功了呢。 

最后不要忘记第三步哦,关闭文件。

    //第三步关闭文件
    fclose(file);
结束。

下面是完整的代码:
 

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    //第一步打开文件
    FILE* file = fopen("test.txt", "r");
 
    //进行判定
    if (file == NULL)
    {
        printf("打开文件失败!!!");
        return 0;
    }
 
    //ch = fgetc(file);
    //ch1 = fgetc(file);
    //printf("%c%c", ch, ch1 );
    //ch = fgetc(file);
    //ch1 = fgetc(file);
    //printf("%c%c", ch, ch1);
    //ch = fgetc(file);
    //ch1 = fgetc(file);
    //printf("%c%c", ch, ch1);
 
    //char ch,ch1;
 
    //while (EOF != (ch=fgetc(file)))
    //{
    //    printf("%c", ch);
    //}
 
    char sentence[200] = {0};
 
    if (fgets(sentence, 200, file) != NULL)
        printf("%s", sentence);
 
    //while(fgets(sentence,200,file) != NULL)
    //    printf("%s", sentence);
 
 
    //while (1)
    //{
 
    //}
    //第三步关闭文件
    fclose(file);
 
    return 0;
 
 
 
 
 
}

还有fread()函数。

四个参数昂,第一个存储位置,第二个字节大小,第三个读取的最大数量,第四个指向文件的指针。

    FILE* file = fopen("test.txt", "r");
 
    //进行判定
    if (file == NULL)
    {
        printf("打开文件失败!!!");
        return 0;
    }
    char sz[200] = {0};
 
    fread(sz,2,100,file);
    printf("%s", sz);
    //第三步关闭文件
    fclose(file);
今天就先讲到文件的读取,等明天进行文件的写入哦。
————————————————
版权声明:本文为CSDN博主「makabaka12138」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/makabaka12138/article/details/127135396

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值