IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Linux 文件编程—ANSIC标准C库(fopen等函数) -> 正文阅读

[C++知识库]Linux 文件编程—ANSIC标准C库(fopen等函数)

此文章为个人学习笔记,有些知识点可能解释得不是那么正确,所以有人参考文章的时候,可以借鉴其他的文章一起来学习!


fopen和open的区别

转载连接1:http://blog.chinaunix.net/uid-29025972-id-3847404.html

转载连接2:https://www.cnblogs.com/nickyye/p/5497659.html

fopen的参数含义

转载连接:https://www.cnblogs.com/hnrainll/archive/2011/09/16/2178706.html

 #include <stdio.h>

FILE *fopen(const char *path, const char *mode);//一般用这个
其中
FILE 返回一个文件流 eg:FILE *fp
const char *path 为打开文件的路径
const char *mode 为打开文件的权限

FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *stream);


int fseek(FILE *stream, long offset, int whence);//跟lseek用法基本一致

long ftell(FILE *stream);
void rewind(FILE *stream);
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, fpos_t *pos);

其中 mode 打开模式:????????????????????????????????????????????
??????? r?? 只读方式打开一个文本文件???????????????????????????
??????? rb? 只读方式打开一个二进制文件?????????????????????????
??????? w?? 只写方式打开一个文本文件???????????????????????????
??????? wb? 只写方式打开一个二进制文件?????????????????????????
??????? a?? 追加方式打开一个文本文件???????????????????????????
??????? ab? 追加方式打开一个二进制文件?????????????????????????
??????? r+? 可读可写方式打开一个文本文件???????????????????????
??????? rb+ 可读可写方式打开一个二进制文件?????????????????????
??????? w+? 可读可写方式创建一个文本文件???????????????????????
??????? wb+ 可读可写方式生成一个二进制文件?????????????????????
??????? a+? 可读可写追加方式打开一个文本文件???????????????????
??????? ab+ 可读可写方式追加一个二进制


size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

size_t 返回一个正整数,且为size_t nmemb值
void *ptr 将数据读到该缓冲区里面去
size_t size 数据类型的大小
size_t nmemb 有多少个该数据类型
(无论这两种怎么读写,反正最后size_t size * size_t nmemb = 数据大小 size_t )
FILE *stream 文件流(从哪一个文件读)


size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

size_t 返回一个正整数,且为size_t nmemb值
const void *ptr 为缓冲区;需要写的数据
size_t size 数据类型的大小
size_t nmemb 有多少个该数据类型
(无论这两种怎么写,反正最后size_t size * size_t nmemb = 数据大小 )
(可理解为一次读size_t size 这么大,一共读 size_t nmemb 这么多次)
FILE *stream 文件流(写进哪一个文件)

上代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
        FILE *fp;
        char *str="hello word ! I LOVE China !";
        fp=fopen("./test14.txt","w+");

        int n_write;
        n_write=fwrite(str,sizeof(char),strlen(str),fp);
        printf("n_write=%d !\n",n_write);
        //frwite(str,sizeof(char)*strlen(str),1,fp);

        fseek(fp,0,SEEK_SET);

        char *readbuf=NULL;
        readbuf=(char *)malloc(sizeof(str));

        int n_read;
        n_read=fread(readbuf, sizeof(char),strlen(str),fp);
        printf("n_read = %d !\n",n_read);
        printf("readbuf test : %s\n",readbuf);

        fclose(fp);//记住一定要关闭文件

        return 0;
}

运行结果

在上面的代码有一个fwrite和fread的一个返回值问题

size_t 返回一个正整数,为size_t nmemb值

原来的写法
int n_fwrite=fwrite(str,sizeof(char),strlen(str),fp);2

修改后的写法
int n_fwrite=fwrite(str,sizeof(char)*strlen(str),1,fp);
//将这里的size_t size改成该数据内容的大小, size_t nmemb改成1,那么返回追n_fwrite的值则是size_t nmemb的值1

对比代码

(这种可用于一些结构体,联合体等中,这样计算大小就不会出现一些计算规则的细节问题)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
        //FILE *fopen(const char *path, const char *mode);
        FILE *fp;
        char *str="hello word ! I LOVE China !";
        fp=fopen("./test14.txt","w+");

        int n_fwrite=fwrite(str,sizeof(char)*strlen(str),1,fp);
//将这里的size_t size改成该数据内容的大小, size_t nmemb改成1,那么返回追n_fwrite的值则是size_t nmemb的值1
        printf("n_fwrite=%d\n",n_fwrite);
        //frwite(str,sizeof(char)*strlen(str),1,fp);


        fseek(fp,0,SEEK_SET);

        char *readbuf=NULL;
        readbuf=(char *)malloc(sizeof(str));

        //size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
        int n_fread=fread(readbuf, sizeof(char),strlen(str),fp);
        printf("n_fread=%d\n",n_fread);
        printf("readbuf test : %s\n",readbuf);

        fclose(fp);//记住一定要关闭文件

        return 0;
}

运行结果


int fgetc(FILE *stream);

是从FILE *stream这个文件里面一个字符一个字符的读取

int fputc(int c, FILE *stream);
是从int c (只含有一个字符)里面一个字符的输出到FILE *stream文件里面去里面去;这个int c 也应该用指针的形式,即fputc(*str,fp),这样在读取字符串的时候比较好用。

int feof(FILE *stream);? ?判断是否达到文件尾部去

如果到达尾部则返回非0,否则返回0。多用在单个字符逐个逐个的读取的方式

#include <stdio.h>
#include <string.h>
int main()
{
        FILE *fp;
        char c = 'a';
        fp=fopen("./test16d3.txt","w+");

        //fputc('a',fp);//将a这个在字符输出到fp的文件里面去,即test16d3.txt。
        fputc(c,fp);//将c字符的内容输出到fp的文件里面去,即test16d3.txt。

        fclose(fp);

        return 0;
}      



#include <stdio.h>
#include <string.h>
int main()
{
        FILE *fp;
        int i;
        char *str="hello China !";
        int len=strlen(str);
        fp=fopen("./test16.txt","w+");
        for(i=0;i<len;i++)
        {
                fputc(*str,fp);
                //将每一次循环时,对应的指针取内容(字符)输出到fp的文件里面去,即test16.txt。
                str++;
        }
        fclose(fp);
        return 0;
}

char *fgets(char *s, int size, FILE *stream);

  • char *s?-- 这是指向一个字符数组的指针,该数组存储读取的字符串。即FILE *stream文件里面内容读到char *s这里面去。
  • int size-- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。用strlen计算。
  • FILE *stream?-- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。
#include <stdio.h>
int main()
{
   FILE *fp;
   char str[60];

   /* 打开用于读取的文件 */
   fp = fopen("./test16d2.txt","r");//如果只是读取文件,最好用只读权限
   if(fp == NULL)
   {
      perror("fopen test16d2.txt error!");
      return(-1);
   }

   if(fgets(str,60,fp)!=NULL )
   {
      puts(str);//这里就是打印刚刚读取出来的数据
   }

   fclose(fp);

   return(0);
}

int fputs(const char *s, FILE *stream);

将const char *s 指针内的字符串输出到FILE *stream的文件里面去

#include <stdio.h>
int main()
{
        FILE *fp;
        //char str[60]={"this is fputs str !"};
        char *str="this is fputs frome *str !";

        fp = fopen("./test16d4.txt","w+");
        //这个是将str数据读到该文件里面去,即该文件为可读可写权限

        fputs(str,fp);

        fclose(fp);

        return(0);
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-02 20:46:10  更:2021-08-02 20:46:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 14:50:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码