首页 > 其他分享 >学习笔记2(第九章)

学习笔记2(第九章)

时间:2023-09-17 19:13:06浏览次数:42  
标签:fp 文件 FILE 二进制 第九章 笔记 学习 int file

一、知识点归纳

1、C语言中常用的文件操作函数

文件打开和关闭

  • fopen: FILE *fopen(const char *filename, const char *mode);
    • 打开一个文件,如果成功,返回一个 FILE * 指针,否则返回 NULL.
    • mode 可以是:
      • "r": 只读打开
      • "w": 写入打开(如果文件存在则清空内容,如果不存在则创建)
      • "a": 附加打开(如果文件存在则追加内容,如果不存在则创建)
      • "r+": 读/写打开
      • "w+": 读/写打开,但会清空原来的内容或创建新文件
      • "a+": 读/写打开,可以追加内容
  • fclose: int fclose(FILE *stream);
    • 关闭一个已打开的文件,成功返回 0,失败返回 EOF.

数据读取

  • fread: size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
    • 从文件中读取数据。
  • fgets: char *fgets(char *str, int n, FILE *stream);
    • 从文件中读取一行。

数据写入

  • fwrite: size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
    • 向文件写入数据。
  • fputs: int fputs(const char *str, FILE *stream);
    • 向文件写入一个字符串。
  • fprintf: int fprintf(FILE *stream, const char *format, ...);
    • 格式化输出到文件。

文件定位

  • fseek: int fseek(FILE *stream, long offset, int whence);
    • 设置文件位置到给定的 offset.
    • whence 可以是:
      • SEEK_SET: 文件开始
      • SEEK_CUR: 当前位置
      • SEEK_END: 文件结束
  • ftell: long ftell(FILE *stream);
    • 返回当前文件位置。
  • rewind: void rewind(FILE *stream);
    • 将文件位置设置为文件开始。

其他

  • feof: int feof(FILE *stream);
    • 检查是否达到文件结束。
  • ferror: int ferror(FILE *stream);
    • 检查文件操作中是否有错误。

举例

  • 源代码:
#include <stdio.h>

int main() {
    FILE *file;
    char content[100];

    file = fopen("test.txt", "r");
    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    while (fgets(content, sizeof(content), file) != NULL) {
        printf("%s", content);
    }

    fclose(file);
    return 0;
}

2、I/O库函数:

功能 函数名 适用于
字符输入函数 getchar 标准输入流
字符输出函数 putchar 标准输出流
字符输入函数 fgetc 所有输入流
字符输出函数 fputc 所有输出流
文本行输入函数 fgtes 所有输入流
文本行输出函数 fputs 所有输出流
格式化输入函数 scanf 标准输入流
格式化输出函数 printf 标准输出流
格式化输入函数 fscanf 所有输入流
格式化输出函数 fprintf 所有输出流
二进制输入 fread 文件
二进制输出 fwrite 文件

3、文件组织参数:

文件组织参数

4、在计算机中,文件大致可以分为两类:

文本文件二进制文件

  1. 文本文件:它包含可读的字符(如字母、数字和标点符号)组成的文本。这些文件可以使用简单的文本编辑器(如 Notepad 或 vi)查看和编辑。文本文件的一个常见示例是 .txt 文件。

  2. 二进制文件:这种文件包含二进制数据,即不仅仅是常规的文本字符。它们可以包含图像、音频、可执行程序或其他数据的二进制表示。简单地使用文本编辑器打开二进制文件通常会显示一堆不可读的字符。常见的二进制文件示例包括 .jpg.mp3.exe 等。

当你在 C 语言中操作二进制文件时,需要使用特定的模式来确保文件以二进制方式正确读取或写入。这主要是为了确保在某些操作系统(如 Windows)中对文件的行结束序列进行正确处理。

以下是 C 语言操作二进制文件的示例:

以二进制模式写入文件

#include <stdio.h>

int main() {
    FILE *file;
    int data[5] = {1, 2, 3, 4, 5};

    file = fopen("binarydata.bin", "wb"); // 注意 "wb" 代表以二进制方式写入

    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    fwrite(data, sizeof(int), 5, file); // 写入整个数组到文件

    fclose(file);
    return 0;
}

以二进制模式读取文件

#include <stdio.h>
int main() {
    FILE *file;
    int data[5];
    int i;

    file = fopen("binarydata.bin", "rb"); // 注意 "rb" 代表以二进制方式读取

    if (file == NULL) {
        printf("无法打开文件\n");
        return 1;
    }

    fread(data, sizeof(int), 5, file); // 从文件读取整个数组

    for (i = 0; i < 5; i++) {
        printf("%d ", data[i]);
    }

    fclose(file);
    return 0;
}

当操作二进制文件时,使用 fread 和 fwrite 函数是非常普遍的,因为它们可以轻松地处理大块的二进制数据。

5、苏格拉底提问:

问题一:![I/O库知识点](/i/l/?n=23&i=blog/3275894/202309/3275894-20230917185829870-636853843.png)

      ![I/O库知识点](/i/l/?n=23&i=blog/3275894/202309/3275894-20230917185840575-459974821.png)

问题二:![文件操作知识点](/i/l/?n=23&i=blog/3275894/202309/3275894-20230917190316852-1779632948.png)

      ![文件操作知识点](/i/l/?n=23&i=blog/3275894/202309/3275894-20230917190404431-674084178.png)

二、问题解决与思路:

1、文件操作都有什么?

文件操作

在计算机编程中,文件操作主要包括以下几个方面:

  • 打开文件: 使用特定的权限或模式打开文件(例如只读、读写、附加等)。
  • 关闭文件: 在完成文件操作后,应始终关闭文件以释放资源。
  • 读取文件: 从文件中读取数据。
  • 写入文件: 向文件中写入数据。
  • 删除文件: 从文件系统中删除文件。
  • 重命名文件: 更改文件的名称。
  • 文件定位: 改变文件的当前位置或获取当前位置,例如使用fseek, ftell等。
  • 文件属性查询: 如检查文件大小、修改日期等。
  • 错误处理: 检查文件操作是否成功,如通过ferrorfeof等。

2、二进制文件和文本文件如何转换?

二进制文件和文本文件如何转换

  • 从文本到二进制: 你可以读取文本文件中的数据,对其进行解析,并将其转换为所需的二进制格式,然后将二进制数据写入二进制文件。
  • 从二进制到文本: 你可以从二进制文件中读取二进制数据,将其转换为可读的文本格式,并将其写入文本文件。

这种转换通常需要特定的解析逻辑,具体取决于你的数据结构和格式。

3、数据结构如何读写?

数据结构如何读写

数据结构的读写取决于特定的数据结构和你的需求。常见的方法包括:

  • 序列化: 将数据结构转换为可以存储或传输的格式。序列化可以是文本格式(如JSON、XML等)或二进制格式。
  • 反序列化: 从存储或传输格式中恢复数据结构。

以下是一个简单的示例,说明如何在C中使用freadfwrite读写结构到二进制文件:

#include <stdio.h>

typedef struct {
    int id;
    char name[50];
} Person;

int main() {
    FILE *file;
    Person personWrite = {1, "John Doe"};
    Person personRead;

    // 写结构到文件
    file = fopen("data.bin", "wb");
    fwrite(&personWrite, sizeof(Person), 1, file);
    fclose(file);

    // 从文件读结构
    file = fopen("data.bin", "rb");
    fread(&personRead, sizeof(Person), 1, file);
    fclose(file);

    printf("ID: %d, Name: %s\n", personRead.id, personRead.name);
    return 0;
}

三、实践过程截图、代码链接

1、实践一:

1、程序: File_rw

2、功能: 实现 1.打开指定文件并读取内容 2.在指定文件末尾追加内容

3、源代码:

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

bool File_check(char *fname) {
    FILE *fp;
    fp = fopen(fname, "r+");
    if (fp == NULL) {
        printf("无法打开文件,按任意键退出!\n");
        getchar();
        return false;
    }
    fclose(fp);  // 检查后关闭文件
    return true;
}

int FileR_O(char *fname) {
    char ch;
    FILE *fp = fopen(fname, "r+");
    if (fp == NULL) {
        printf("无法打开文件进行读取,按任意键退出!\n");
        getchar();
        exit(1);
    }
    while ((ch = fgetc(fp)) != EOF) {
        putchar(ch);
    }

    putchar('\n');
    if (ferror(fp)) {
        puts("出错了!");
        fclose(fp);
        return -1;
    } else {
        puts("\n成功!");
        fclose(fp);
        return 0;
    }
}

int FileW_I(char *fname) {
    char str[102] = {0}, strTemp[100];
    FILE *fp = fopen(fname, "at+");
    if (fp == NULL) {
        printf("无法打开文件进行写入,按任意键退出!\n");
        getchar();
        exit(1);
    }
    printf("请输入字符串:\n");
    scanf("%s", strTemp);	
    strcat(str, "\n");
    strcat(str, strTemp);
    fputs(str, fp);
    fclose(fp);
    return 0;
}

int main(int argc, char *argv[]) {
    char Fname[50];
    printf("选择操作:1.读取文件  2.写入文件\n");
    scanf("%d", &choice);
    printf("请输入你想操作的文件名:\n");
    scanf("%s", Fname);

    if (!File_check(Fname)) {
        return -1;
    }

    if (choice == 1) {
        FileR_O(Fname);
    } else if (choice == 2) {
        FileW_I(Fname);
        printf("新的文件内容:\n\n");
        FileR_O(Fname);
    } else {
        return -1;
    }

    return 0;
}

4、截图

实践截图1

2、实践二:

1、程序: downtoUP

2、功能: 将指定文件内小写字母转换为大写字母

3、源代码:

#include <stdlib.h>
#include <string.h>
 
int main ()
{
    FILE *fp;
    char Filename[50], ch;
    int count = 0;
    printf("Enter PathName:");
    scanf("%s", Filename);
    if((fp = fopen(Filename, "r")) == NULL)
    {
        printf("File open failed!\n");
        exit(0);
    }
    while(!feof(fp))
    {
        ch = fgetc(fp);
        if(ch != EOF)
        {
            if(ch >= 'a' && ch <= 'z')
            {
                ch -= 32;
                count ++;
            }
            printf("%c", ch);
        }
    }
    printf("\ntotal change : %d\n", count);
    return 0;
}

4、截图

实践截图2

标签:fp,文件,FILE,二进制,第九章,笔记,学习,int,file
From: https://www.cnblogs.com/20211125mjz/p/17709479.html

相关文章

  • (数据科学学习手札154)geopandas 0.14版本新特性一览
    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes1简介大家好我是费老师,就在前两天,Python生态中的GIS运算神器geopandas发布了其0.14.0新版本,在这次新版本更新中,不仅是新增了许多矢量计算API,还开始为日后正式发布1.0版本做准备,对......
  • 《Java编程思想第四版》学习笔记28--关于StreamTokenizer
    //:SortedWordCount.java//Countswordsinafile,outputs//resultsinsortedform.importjava.io.*;importjava.util.*;importc08.*;//ContainsStrSortVectorclassCounter{privateinti=1;intread(){returni;}voidincrement(){i++;}}pu......
  • 信息安全系统设计与实现学习笔记2
    学习笔记2知识点总结文件操作文件操作涵盖了对文件的添加、删除、修改、打开、关闭等基本操作。二进制文件和文本文件的转换二进制转文本文件需要构建二进制转十六进制函数,按照每八位一组,每四位一单元进行转换。反过来,文本文件转二进制文件需要构建十六进制转二进制函......
  • 20211312徐元琦学习笔记2
    第9章I/O库函数——教材知识点归纳9.1~9.2系统调用和I/O库函数系统调用:操作系统中,进程以两种不同的方式运行:内核模式(Kmode)和用户模式(Umode)。Umode权限有限,特殊权限的操作需要在Kmode下进行。系统调用(SystemCall)机制允许进程进入Kmode,执行更高权限的操作。系统调用和I/O......
  • CentOS8部署NextCloud+onlyoffice笔记
    通过宝塔一键部署一、安装宝塔yuminstall-ywget&&wget-Oinstall.shhttp://download.bt.cn/install/install_6.0.sh&&shinstall.sh二、从宝塔Docker快速部署安装NextCloud。一键部署,按照向导逐步安装三、安装onlyoffice应用1、安装onlyoffice文档服务器......
  • 《信息安全系统设计与实现》第二周学习笔记
    教材知识点总结第九章I/O库函数I/O库函数与系统调用系统调用函数open()read()write()lseek()close()I/O库函数fopen()fread()fwrite()fseek()fclose()可见每个库函数的根都在对应系统调用函数中I/O库函数的算法fread算法第一次调用fread()时,FILE结构......
  • 学习笔记2 代码
    静态库测试代码gccsrc/hello.c-c-Iinclude-obin/hello.ocdbinarrcsvlibhello.ahello.ocd..mvbin/libhello.alibgccsrc/main.c-Iinclude-Llib-lhello-obin/hello动态库测试代码gcc-fPIC-sharedsrc/hello.c-Iinclude-olib/libhello.soexportLD_L......
  • Vue学习六:路由进阶
    一、路由的封装抽离目标:将路由模块抽离出来。好处:拆分模块,易于维护。第一步:在src目录下新建一个router目录,在创建一个index.js文件,将先前main.js中的路由代码转移到index.js文件中。(这里需要使用到vue所以需将vue包导入;需修改组件路径,@符号代表绝对路径src;需将路由实例导出)index......
  • Linux学习之CentOS(二十七)--Linux磁盘管理:LVM逻辑卷的拉伸及缩减
    您可以通过点击右下角的按钮来对文章内容作出评价,也可以通过左下方的关注按钮来关注我的博客的最新动态。如果文章内容对您有帮助,不要忘记点击右下角的推荐按钮来支持一下哦如果您对文章内容有任何疑问,可以通过评论或发邮件的方式联系我:[email protected]......
  • 《信息安全系统设计与实现》第二周学习笔记
    I/O库函数方便用户使用,提高文件操作整体效率的一系列文件操作函数。I/O库函数与系统调用系统调用函数open()read()write()lseek()close()I/O库函数fopen()fread()fwrite()fseek()fclose()I/O库函数的算法fread在第一次调用fread()时,FILE结构体的缓冲区是空的,fread()使用保存的文件......