首页 > 其他分享 >第二周学习笔记

第二周学习笔记

时间:2023-09-16 10:00:46浏览次数:58  
标签:文件 读取 stream int 写入 笔记 学习 第二周 指针

I/O数据库的使用

一、I/O数据库与系统调用

系统调用函数:open()、read()、write()、lseek()、close()

I/O库函数:fopen()、fread()、fwrite()、fseek()、fclose()

I/O库函数例

系统调用例

两者区别:

  1. IO库函数提供了更高级别的接口和抽象,使得输入和输出操作更加方便和易用,而系统函数则提供了对底层系统资源和功能的直接访问,更加灵活和底层。
  2. 其次从以上代码实现不难看出系统调用open()打开一个文件进行读取,并返回一个整数文件描述符fd,如果open()失败,则返回-1。I/O库函数fopen()返回一个FILE结构体指针,如果fopen()失败,则返回NULL。
  3. 当库函数没有使用系统调用时,效率是绝对高于系统调用的;当库函数使用了系统调用时,应该根据缓冲区大小和读取方式来决定谁的效率高

二、 I/O库函数的基本算法

1.fopen( ) 算法
*/第一个参数filename:文件路径 ;第二个参数modes:打开文件方式*/
FILE * fopen(const char * filename, const char * modes)
参数 含义
filename 文件的路径
mode 文件的打开方式或使用文件的权限
返回值 如果文件成功打开,fopen() 函数将返回一个指向文件的有效指针。如果打开文件失败,它将返回一个空指针 NULL
mode常用参数:
  • "r": 只读模式。打开文件用于读取。如果文件不存在,则打开失败。
  • "w": 写入模式。打开文件用于写入。如果文件不存在,则创建文件;如果文件已存在,则截断文件为零长度。
  • "a": 追加模式。打开文件用于写入,但是写入的数据将追加到文件的末尾。如果文件不存在,则创建文件。
  • "r+": 读写模式。打开文件用于读取和写入。文件必须存在。
  • "w+": 读写模式。打开文件用于读取和写入。如果文件不存在,则创建文件;如果文件已存在,则截断文件为零长度。
  • "a+": 读写模式。打开文件用于读取和写入。写入的数据将追加到文件的末尾。如果文件不存在,则创建文件。
  • "rb": 二进制读取模式。以二进制格式打开文件用于读取。文件必须存在。
  • "wb": 二进制写入模式。以二进制格式打开文件用于写入。如果文件不存在,则创建文件;如果文件已存在,则截断文件为零长度。
  • "ab": 二进制追加模式。以二进制格式打开文件用于写入,但是写入的数据将追加到文件的末尾。如果文件不存在,则创建文件。
  • "r+b": 二进制读写模式。以二进制格式打开文件用于读取和写入。文件必须存在。
  • "w+b": 二进制读写模式。以二进制格式打开文件用于读取和写入。如果文件不存在,则创建文件;如果文件已存在,则截断文件为零长度。
  • "a+b": 二进制读写模式。以二进制格式打开文件用于读取和写入。写入的数据将追加到文件的末尾。如果文件不存在,则创建文件。
2.fclose( )算法
*/stream:文件指针 返回值:成功0,失败EOF*/
int fclose(FILE * stream)
参数 含义
stream steam是一个指向文件的指针,表示需要关闭的文件
返回值 返回值为0表示成功关闭文件,而非0值则通常表示在关闭文件时发生了错误。
3.fgets( )算法
*/str 存储地址;int n 这是要读取的最大字符数/*
char *fgets(char *str, int n, FILE *stream)
参数 含义
str str是一个字符数组或者说是字符串存储的地址
n 读取的字符数
stream 指向读取文件的指针
返回值 str中存储的内容,如果在读取时发生错误或到达文件末尾,fgets() 函数将返回 NULL
4.fread( )算法
*/ptr存储数据的地址、size读取元素的大小、nmemb读取多少个元素、stream文件指针*/
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
参数 含义
ptr 指向存储数据的地址
size 读取元素大小,通常使用sizeof( ) 来判断大小
nmemb 读取元素的个数
stream 指向读取文件的指针
返回值 读取的数据块数量
5.fwrite( )算法
*/ptr待写入数据的地址、size写入元素的大小、nmemb写入多少个元素、stream文件指针*/
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
参数 含义
ptr 指向存储数据的地址
size 写入元素大小,通常使用sizeof( ) 来判断大小
nmemb 写入元素的个数
stream 指向读取文件的指针
返回值 成功写入的数据块数量
6.fseek( )算法
*/stream:文件指针,long offest:指针偏移量,int fram where:指针偏移位置,可取值:SEEK_SET,SEEK_CUR,SEEK_END*/
int fseek(FILE* stream,long offest,int framwhere)
参数 含义
stream 操作的文件指针
offest 偏移量,即要移动的字节数
frameware 指定起始位置的方式
返回值 如果成功,fseek() 函数返回 0。如果发生错误,返回值为非零,表示出现了错误。
frameware的常用参数:
  • SEEK_SET:起始位置为文件开头。
  • SEEK_CUR:起始位置为当前文件位置指针的位置。
  • SEEK_END:起始位置为文件末尾。
7. ftell( ) 算法
*/该函数返回位置标识符的当前值*/
long int ftell(FILE *stream)
参数 含义
stream 要获取偏移量的文件指针
返回值 成功返回当前文件位置指针的偏移量,失败返回-1
8.fputs( ) 算法
*/str是要写入的字符序列数组*/
int fputs(const char *str, FILE *stream)
参数 含义
str 要写入文件的字符串,必须以 null 结尾
stream 写入文件的指针
返回值 如果成功,fputs() 函数返回非负值,如果发生错误,返回值为 EOF(通常为-1)
9.fscanf( )算法
*/从文件流中以格式format读取数据*/
int fscanf(FILE * stream, const char * format, ...)
参数 含义
stream 读取文件的执政
format 格式字符串,指定了要读取的数据的格式和存储位置
…… 可变数量的参数,用于存储从文件中读取的数据
返回值 成功返回存储的输入项的数量,发生读取错误或到达文件末尾,返回值可能为负值,未成功匹配任何输入项,返回值为0
10.fprintf( )算法
int fprintf(FILE * stream, const char * format, ...)
参数 含义
stream 要写入数据的文件指针
format 格式字符串,指定了要写入数据的格式。
返回值 可变数量的参数,与格式字符串中的格式说明符相对应

三、行I/O与字符I/O

1.fgets( )与getc( )

  1. 功能: fgetc 函数用于从文件中读取单个字符,并将其作为整数返回。每次调用 fgetc 函数,它会自动向后移动文件指针,以便读取下一个字符。 fgets 函数用于从文件中读取一行字符串,包括换行符(\n),并将其存储到指定的缓冲区中。每次调用 fgets
    函数,它会读取一行字符,直到达到指定的最大字符数、遇到换行符或到达文件结尾。
  2. 参数: fgetc 函数接受一个文件指针作为参数,用于指定要读取的文件。 fgets 函数接受三个参数:缓冲区指针、最大读取字符数和文件指针。它会将读取的字符串存储到指定的缓冲区中。
  3. 返回值:fgetc 函数返回读取的字符的整数值。如果到达文件结尾或发生错误,它会返回特殊值 EOFfgets 函数返回一个指向读取的字符串的指针。如果到达文件结尾或发生错误,它会返回空指针。
  4. 读取方式:fgetc 函数每次只能读取一个字符。 fgets 函数可以读取一行字符,包括换行符,但是如果一行字符超过了指定的最大字符数,它会截断字符串并在末尾添加 \0

2.fputs( )与putc( )

  1. 功能: fputs 函数用于将字符串写入文件,它会自动写入字符串中的所有字符,直到遇到字符串的结束符 \0putc 函数用于将单个字符写入文件。
  2. fputs 函数接受两个参数:要写入的字符串和文件指针。它会将整个字符串写入到指定的文件中。 putc 函数接受两个参数:要写入的字符和文件指针。它会将指定的字符写入到指定的文件中。
  3. 返回值:fputs 函数不返回任何值。 putc 函数返回写入的字符的整数值。如果发生错误,它会返回特殊值 EOF
  4. 写入方式:fputs 函数会自动写入字符串中的所有字符,直到遇到字符串的结束符 \0putc 函数只能写入一个字符。

四、代码实现

行IO

*/filecopy*/
#include <stdio.h>

int main()
{
    FILE *p, *q;
    char buff[256];
    const char *s = "this is a string";

    p = fopen("source.txt", "r");
    q = fopen("target.txt", "w");

    if (p == NULL || q == NULL) {
        printf("Failed to open files.\n");
        return 1;
    }

    fgets(buff, sizeof(buff), p);
    fputs(buff, q);

    fclose(p);
    fclose(q);

    return 0;
}

字符IO

*/filecopy*/
#include <stdio.h>
FILE *fp,*gp;
int main()
{
int m;
fp=fopen("source.txt","r");
gp=fopen("target.txt","w");
while ((m=gtec(fp))!= EOF)
putc(m,gp);
fclose(fp);
fclose(gp);
}

使用fread( )与fwrite( )编写一个程序能从键盘输入到文件里

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

int main()
{
    FILE* file=fopen("./a.txt","w+");
    assert(file!=NULL);
    while(1)//循环读取数据
    {
        printf("input:");
        char buff[128]={0};
        fgets(buff,128,stdin);//从键盘输入
        if(strncmp(buff,"end",3)==0)//比对输入是否为end
        {
            break;
        }
        int n=fwrite(buff,sizeof(char),strlen(buff),file);//指针指向的缓冲区,字节大小,数量,文件流*file
        if(n==0)
        {
            printf("fwrite error");
            exit(0);
        }
    }
    printf("------fwrite over----------\n");
    
    int n=fseek(file,0L,SEEK_SET);//重定位
    if(n==-1)
    {
        printf("fseek error");
        exit(0);
    }
    while(1)
    {
        char buff[128]={0};
        int n=fread(buff,sizeof(char),128,file);//读取失败返回0
        if(n==0)
        {
            printf("------fread over----------\n");
            exit(0);
        }
        else
        {
            
            printf("%s",buff);
        }
    }
    fclose(file);
    exit(0);
}

标签:文件,读取,stream,int,写入,笔记,学习,第二周,指针
From: https://www.cnblogs.com/qi-yu-lin/p/17706328.html

相关文章

  • FastAPI学习-14. JSONResponse 返回JSON内容
    当你创建一个 FastAPI 路径操作 时,你可以正常返回以下任意一种数据:dict,list,Pydantic模型,数据库模型等等。FastAPI 默认会使用 jsonable_encoder 将这些类型的返回值转换成JSON格式,默认情况下会以content-type:application/json格式返回在有些情况下,我们需要在路径操......
  • 《LINUX设备驱动程序》学习笔记 ——02
    1.编译模块构造内核模块之前,需要注意以下条件:正确版本的编译器、模块工具和其他必要的工具。太新的或太老的工具都会对使得模块构造后产生许多复杂的问题,因为内核源代码对编译器做了大量假定,因此新的(或旧的)编译器版本可能导致问题出现。另外,尽量运行和模块对应的内核版......
  • 初高中学习差异
    今天是9月14号,也就是高中刚刚开学两周,也是感受差异最明显的时候,我认为有必要记录一下初中和高中的学习模式差异。首先是课程,初中有语数外物化五科算主课,而高中是\(3+1+2\)一共六门主课,一天每门主课最多只会上一课,所以不存在一节课连堂的情况,不过这也让人比较痛苦,即每门课一天......
  • 《动手学深度学习 Pytorch版》 6.2 图像卷积
    importtorchfromtorchimportnnfromd2limporttorchasd2l6.2.1互相关计算X=torch.tensor([[0.0,1.0,2.0],[3.0,4.0,5.0],[6.0,7.0,8.0]])K=torch.tensor([[0.0,1.0],[2.0,3.0]])此处应为:012345678*0123=......
  • 用强化学习构建个性化的二维码
     技术概述AIGC在图像生成领域如火如荼,StableDiffusion加各种LORA,ControlNet,大家玩得不亦乐乎。但是基于扩散模型的方式,仍然存在很多问题,比如抽卡成功率过低,生成图像的细节仍需优化。具体到二维码生成,目前huggingface上的几个ControlNet确实可以生成不错的二维码和语义......
  • 用强化学习构建个性化的二维码
     技术概述AIGC在图像生成领域如火如荼,StableDiffusion加各种LORA,ControlNet,大家玩得不亦乐乎。但是基于扩散模型的方式,仍然存在很多问题,比如抽卡成功率过低,生成图像的细节仍需优化。具体到二维码生成,目前huggingface上的几个ControlNet确实可以生成不错的二维码和语义......
  • Python机器学习——鸟类图像分类
    (一)选题背景:1.生物多样性保护:鸟类是地球上最为丰富和多样的脊椎动物类群之一,对于生态系统的稳定和生物多样性的维持起着重要作用。通过开展鸟类图像分类研究,可以帮助精确地辨别鸟类物种,有助于监测鸟类的分布、数量和迁徙情况,从而更好地实施生物多样性保护和生态环境管理。......
  • 如果你学习VMware vSphere虚拟化很久感觉还没入门,那么请看我的这门视频课程《基于共享
    LanderZhang|企业IT运维&项目实施服务&-企业IT运维实战视频课程开发51CTO学堂讲师,超12W学员,44门课程更新时间:2023/09/15闲话不多说,如果你学习VMwarevSphere虚拟化很久感觉还没入门,那么请看我的这门视频课程《基于共享存储部署VMwarevSphere企业虚拟化实战环境》,相信你在之前学习......
  • 基于机器学习的情绪识别算法matlab仿真,对比SVM,LDA以及决策树
    1.算法理论概述      情绪识别是一种重要的情感分析任务,旨在从文本、语音或图像等数据中识别出人的情绪状态,如高兴、悲伤、愤怒等。本文介绍一种基于机器学习的情绪识别算法,使用三种常见的分类算法:支持向量机(SVM)、线性判别分析(LDA)和决策树,通过对比这三种算法在情绪识别任......
  • Vue学习五:自定义指令、插槽
    一、自定义指令自定义指令:自己定义的指令,可以封装一些dom操作,扩展额外功能全局注册语法Vue.directive('指令名',{"inserted"(el){//可以对el标签,扩展额外功能}})ViewCode局部注册语法directives:{"指令名":{"inserted"(el){......