读取文件操作的标准I/O函数

本文详细解析了文件读取操作中的fopen、fread和feof函数,包括其参数说明、功能说明及示例代码,展示了如何通过这些函数进行文件的读取和参数信息的获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读取文件操作的标准I/O函数

fopen
函数定义:FILE *fopen(const char *path,const char *mode)
参数说明:path为指定文件的路径,mode为打开模式,取值可以为r、r+、w、w+、a、a+。
功能说明:以mode方式打开path文件。

fread
函数定义:size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream)
参数说明:ptr为用来存放读取到的字节的缓冲区,size*nmemb为读取到的字符数,stream为当前打开的文件流。
功能说明:从stream中读取size*nmemb个字节到ptr中,返回实际读取到的字节数。

feof
函数定义:int feof(FILE *stream)
参数说明:stream为当前打开的文件流。
功能说明:判断是否是文件末尾,否则返回0,是则返回非0。

在网上找了个例子,如下所示:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
void read(char *argv);
int main(int argc,char *argv[]){
    printf("\n\n***************你输入了 %d 个文件***************\n\n",argc-1);
    int m = 0;
    for(m = 1;m < argc;m++){
        printf("\n***********第 %d 个文件的内容如下所示************\n",m);

        read(argv[m]);
        printf("\n***************************************************\n\n");
    }
}
void read(char *argv){
    FILE *fd;
        int i = 0, j = 0, y = 0, k = 0;
        char buf;

/**
*********************************************************************************************************
*   根据键入的参数(argv[1]),传入一个文件名称,打开这个文件,获取到这个文件的相关参数:文件字符数,行数 *
*********************************************************************************************************
*/

        fd = fopen(argv, "r");               // 以只读方式打开argv指定的文件
        if (fd == NULL) {                    // 如果没有获取到指定文件的指针
            printf("打开文件失败!\n");    // 提示打开文件失败,正常退出
            exit(0);
        } else {            // 已经成功打开文件,进一步进行读取
            printf("打开文件成功!现在开始读文件参数信息...\n");
            while (1) {                    // 设置while循环,连续读取文件内容
                    if ((fread(&buf, 1, 1, fd)) == 0) {        //每一次从文件中读取一个字节放到字符缓冲区buf中
                        if (!feof(fd))                // 通过文件指针fd判断是否读取到文件最后,如果不是在最后就明在这里读文件出错
                                printf("读取文件参数信息失败!\n");        //然后打印出来
                    goto fin;                //确认是读文件到最后,然后跳到fin去执行
                    } else {                    //读文件成功
                        i++;                    //计算出i的值然后可以知道一个文件中有多少字节,就是i的值啦
                        if (buf == 0x0a)            //判断是否读到了换行符,0a是十六进,表示换行
                                j++;                //每换一次行给j加一次,从而可知一共有多少行
                        }
            }
        }

/**
* ************************************************************************************************************
*   *                             读取文件的内容,并将内容存放到数组x中                                        *
*    ************************************************************************************************************
*/

fin:                            //实现goto语句
        fclose(fd);                        //关闭上面打开的文件
        char x[i + 1];                    //为文件动态地分配内存
        memset(x, 0, i + 1);                //先清空
        fd = fopen(argv, "r");
        memset(x, 0, i + 1);
        fd = fopen(argv,"r");
        if (fd == NULL) {
            printf("打开文件成功!接着进行读取文件操作。\n");
            exit(0);
        } else {
            printf("开始读取文件内容...\n");
            while (1) {
                    if ((fread(&buf, 1, 1, fd)) == 0) {
                        if (!feof(fd))
                                printf("读取文件内容失败!\n");
                        goto finish;
                    } else {
                        x[y++] = buf;                //把所有字符读到x数组中
                    }
            }
        }

/**
********************************************************************************************************
*                            打印输出数组x中读取到的文件内容                                           *
********************************************************************************************************
*     */
finish:
    printf("读取文件操作结束!\n");
    printf("共有%d行,%d个字符\n", j, i);            //打印出行数和字符总数
    printf("字符内容是:%s", x);                //打印文章中的内容
    y = -1;
    for (k = 0; k < j; k++) {
            printf("\n第%d行是:\n", k + 1);
            for (y = y + 1; y < i; y++) {
                    if (x[y] == 0x0a)                //当碰到换行符时结束,跳到上面去打印出行号
                        break;
                printf("%c", x[y]);                //打印出每一行的字符
            }
    }
    fclose(fd);


}


编译:

[root@host C]# gcc -o read read.c

运行:

[root@host C]# ./read hello.c matrix.c

保证当前目录下存在上面输入的两个文件,读取文件的结果如下所示:


***************你输入了 2 个文件***************


***********第 1 个文件的内容如下所示************
打开文件成功!现在开始读文件参数信息...
开始读取文件内容...
读取文件操作结束!
共有6行,82个字符
字符内容是:#include <stdio.h>
int main()
{
        printf("\nHello,the world!!!\n\n");
        return 0;
}

第1行是:
#include <stdio.h>
第2行是:
int main()
第3行是:
{
第4行是:
        printf("\nHello,the world!!!\n\n");
第5行是:
        return 0;
第6行是:
}
***************************************************


***********第 2 个文件的内容如下所示************
打开文件成功!现在开始读文件参数信息...
开始读取文件内容...
读取文件操作结束!
共有29行,295个字符
字符内容是:#include <stdio.h>
……


最后说明:

主函数int main(int argc,char *argv[])声明中,argc表示在控制台中输入的参数的个数,argv[]用来存放argc个参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值