当前位置: 首页 > article >正文

Linux应用层学习——Day2(文件IO)

fopen

#include <stdio.h>

int main(int argc,char const *argv[])
{

    // FILE *fopen (const char *__restrict __filename:字符串要打开的文件名称,
	// 	    const char *__restrict __modes:打开的模式
    // 1) r:只读模式,如果没有文件报错
    // 2) w:只写模式 如果文件存在则清空文件,如果不存在则创建新文件
    // 3) a:只追加写模式 如果文件存在则在末尾追加写 如果不存在则创建新文件
    // 4) r+: 读写模式 文件必须存在 写入是从头一个一个覆盖
    // 5) w+: 读写模式 如果不存在创建新文件
    // 6) a+:追加读写模式 如果文件存在则在末尾追加写 如果不存在则创建新文件
    // return FILE * 结构体指针 表示一个文件
    // 报错返回 NULL

    char *filename = "io.txt";//创建filename指针变量,指向io.txt

    FILE * ioFile = fopen(filename,"r");//FILE是C语言标准库stdio.h中定义的一个结构体,用于数据缓存,创建一个结构体指针

    if(ioFile == NULL)
    {
        printf("failed");
    }
    else {
        printf("sucess");
    }
    return 0;
}

Makefile

CC:=gcc

fopen_test: fopen_test.c
	-$(CC) -o $@ $^
	-./$@
	-rm ./$@

CC:=gcc的作用是把gcc变成变量CC,这样后面改只需要改一个CC
$@是目标文件的名称,就是fopen_test
$^代表所用依赖名,就是fopen_test.c、
-./$@执行文件
-rm ./$@删除文件
把读取模式换成写模式后,执行
在这里插入图片描述

fclose

#include <stdio.h>

int main(int argc,char const *argv[])
{

    // FILE *fopen (const char *__restrict __filename:字符串要打开的文件名称,
	// 	    const char *__restrict __modes:打开的模式
    // 1) r:只读模式,如果没有文件报错
    // 2) w:只写模式 如果文件存在则清空文件,如果不存在则创建新文件
    // 3) a:只追加写模式 如果文件存在则在末尾追加写 如果不存在则创建新文件
    // 4) r+: 读写模式 文件必须存在 写入是从头一个一个覆盖
    // 5) w+: 读写模式 如果不存在创建新文件
    // 6) a+:追加读写模式 如果文件存在则在末尾追加写 如果不存在则创建新文件
    // return FILE * 结构体指针 表示一个文件
    // 报错返回 NULL

    char *filename = "io.txt";//创建filename指针变量,指向io.txt

    FILE* ioFile = fopen(filename,"w");//FILE是C语言标准库stdio.h中定义的一个结构体,用于数据缓存,创建一个结构体指针

    if (ioFile == NULL)
    {
        printf("failed打开文件失败\n");
    }
    else {
        printf("打开成功\n");
    }

    //int fclose (FILE *__stream);
    //FILE *__stream:需要关闭的文件
    //return:成功返回0 失败返回EOF(负数),通常关闭失败直接报错
    int result = fclose(ioFile);
    if (result == EOF)
    {
        printf("关闭文件失败\n");
    }else if (result == 0)
    {
        printf("关闭文件成功\n");
    }
    return 0;
}

Makefile也需要写一下

CC:=gcc

fopen_test: fopen_test.c
	-$(CC) -o $@ $^
	-./$@
	-rm ./$@


fclose_test: fclose_test.c
	-$(CC) -o $@ $^
	-./$@
	-rm ./$@

fputc

一次输入一个字节

#include <stdio.h>

int main(int argc,char const *argv[])
{

    // FILE *fopen (const char *__restrict __filename:字符串要打开的文件名称,
	// 	    const char *__restrict __modes:打开的模式
    // 1) r:只读模式,如果没有文件报错
    // 2) w:只写模式 如果文件存在则清空文件,如果不存在则创建新文件
    // 3) a:只追加写模式 如果文件存在则在末尾追加写 如果不存在则创建新文件
    // 4) r+: 读写模式 文件必须存在 写入是从头一个一个覆盖
    // 5) w+: 读写模式 如果不存在创建新文件
    // 6) a+:追加读写模式 如果文件存在则在末尾追加写 如果不存在则创建新文件
    // return FILE * 结构体指针 表示一个文件
    // 报错返回 NULL

    char *filename = "io.txt";//创建filename指针变量,指向io.txt

    FILE* ioFile = fopen(filename,"w");//FILE是C语言标准库stdio.h中定义的一个结构体,用于数据缓存,创建一个结构体指针

    if (ioFile == NULL)
    {
        printf("failed打开文件失败\n");
    }
    else {
        printf("打开成功\n");
    }



    //int fputc (int __c, FILE *__stream);
    //int __c:ASCII码对应的char
    //FILE *__stream :打开的一个文件
    //return: 成功返回char 失败返回 EOF
    int put_result = fputc(97,ioFile);
    if (put_result == EOF)
    {
        printf("写入文件失败\n");
    }else{
        printf("写入%c成功\n",put_result);
    }
    //int fclose (FILE *__stream);
    //FILE *__stream:需要关闭的文件
    //return:成功返回0 失败返回EOF(负数),通常关闭失败直接报错
    int result = fclose(ioFile);
    if (result == EOF)
    {
        printf("关闭文件失败\n");
    }else if (result == 0)
    {
        printf("关闭文件成功\n");
    }
    return 0;
}

Makefile也需要写一下,要注意顺序,应该是先打开,然后写入,然后关闭

CC:=gcc

fopen_test: fopen_test.c
	-$(CC) -o $@ $^
	-./$@
	-rm ./$@


fputc_test: fputc_test.c
	-$(CC) -o $@ $^
	-./$@
	-rm ./$@


fclose_test: fclose_test.c
	-$(CC) -o $@ $^
	-./$@
	-rm ./$@

fputs

这里和fputc的区别就是fputs是输进去字符串的

    //int fputs (const char *__restrict __s, FILE *__restrict __stream);
    // const char *__restrict __s:需要写入的字符串
    //FILE *__restrict __stream:需要写入的文件
    //return:成功返回非负整数,一般是0和1 失败返回EOF
    int putsR = fputs("love letter\n",ioFile);
    if(putsR == EOF)
    {
        printf("写入字符串失败\n");
    }else{
        printf("写入字符串%d成功\n",putsR);
    }

Makefile

CC:=gcc

fopen_test: fopen_test.c
	-$(CC) -o $@ $^
	-./$@
	-rm ./$@


fputc_test: fputc_test.c
	-$(CC) -o $@ $^
	-./$@
	-rm ./$@

fputs_test: fputs_test.c
	-$(CC) -o $@ $^
	-./$@
	-rm ./$@


fclose_test: fclose_test.c
	-$(CC) -o $@ $^
	-./$@
	-rm ./$@

fprintf

    // fprintf (FILE *__restrict __stream, const char *__restrict __fmt, ...)
    //FILE *__restrict __stream:打开的文件 这次是先写要打开的文件
    //char *__restrict __fmt:带格式化的长字符串
    //...可变参数:填入格式化的长字符串
    //return: 成功返回写入的字符个数 不包含换行符 失败返回EOF
    char *name = "叮咚鸡";
    int printfR = fprintf(ioFile,"这是输入的内容\n这里是第二行\n这里是最后一行\n \n\t\t %s",name);
    if(printfR == EOF)
    {
        printf("字符串写入失败\n");
    }else{
        printf("字符串%d写入成功",printfR);
    }

Makefile

fprintf_test: fprintf_test.c
	-$(CC) -o $@ $^
	-./$@
	-rm ./$@	

fgetc

读取文件的单个字节
因为中文是按照utf-8编码,3个字节组成一个字,所以按照一个一个读取的方式,只能去读英文单个字符,但是如果只按照printf的方式去输出的话,是会出现乱码的,所以只能采取循环的形式去读

#include<stdio.h>


int main(int argc,char const *argv[])
{

    FILE * ioFile = fopen("io.txt","r");
    if(ioFile == NULL)
    {
        printf("无法读取此文件,文件不存在\n");
    }else{
        printf("已读取文件\n");
    }

    //int fgetc (FILE *__stream);
    //FILE *__stream:打开的文件
    //return:读取到的1个字节 如果没读取到或者是文件末尾则EOF
    char c = fgetc(ioFile);

    while(c != EOF)
    {   
        printf("%c",c);
        c = fgetc(ioFile);
    }
    printf("\n");

    int closeR = fclose(ioFile);
    if(closeR == EOF)
    {
        printf("关闭文件失败\n");
    }else if(closeR == 1)
    {
        printf("成功关闭文件\n");
    }
    return 0;
}

Makefile

fgetc_test: fgetc_test.c
	-$(CC) -o $@ $^
	-./$@
	-rm ./$@

http://www.kler.cn/a/397493.html

相关文章:

  • 51单片机基础05 定时器
  • 20.UE5UI预构造,开始菜单,事件分发器
  • 探秘Spring Boot中的@Conditional注解
  • js像循环数组那样循环一个数字,Array.from()
  • 【星海随笔】ZooKeeper-Mesos
  • [Admin] Dashboard Filter for Mix Report Types
  • 【青牛科技】D54123 漏电保护电路介绍及应用
  • 刘艳兵-DBA037-在ASM实例中,如下哪个参数是必须的?
  • git没有识别出大写字母改成小写重命名的文件目录
  • C++(Qt)软件调试---内存分析工具Heob(26)
  • 借助 Pause 容器调试 Pod
  • 【微软:多模态基础模型】(3)视觉生成
  • docker ce 阿里云Linux安装
  • 类与对象;
  • 赋予孩子光明未来:孤独症自闭症干预机构的专业治疗
  • [AI] 【提高认知】自动翻译技术的演变:从规则系统到深度学习的崛起
  • 一、mysql中一条SQL查询语句是如何执行的
  • asitop macOS 终端 性能监控
  • 跟我学C++中级篇——RAII
  • 51单片机基础 06 串口通信与串口中断
  • JAVA接入WebScoket行情接口
  • 高精度加法高精度乘法
  • 关键JavaScript进行表单验证:提升用户体验与数据完整性
  • 事务一致性的理解
  • 网络工程师教程第6版(2024年最新版)
  • 硬石电机学习2024116