首页 > 其他分享 >2023-2024-1 20211327 信息安全系统设计与实现 学习笔记2(必做)

2023-2024-1 20211327 信息安全系统设计与实现 学习笔记2(必做)

时间:2023-09-17 16:24:11浏览次数:38  
标签:文件 file 读取 读写 写入 2024 文本文件 2023 20211327

学习笔记2

  • C语言文件操作内容知识点总结
  • 运用ChatGPT进行苏格拉底挑战,发现问题与解决思路
  • 实践过程截图

C语言文件操作内容知识点总结

  • C语言文件基础操作
  • 字符读写、行读写、任意位置读写
  • 数据结构读写
  • 结构化从文本文件操作
  • 二进制文件与文本文件转换

C语言文件基础操作

1. 文件指针:

  • C语言使用文件指针来管理文件操作。FILE 类型的指针用于表示文件对象。
  • 常见的文件指针有 FILE *fp;,其中 fp 是一个指向文件的指针。

2. 文件读取:

  • 使用 fscanffgetsfread等函数从文件中读取数据。
  • fscanf 用于按格式从文件中读取数据,而 fgets 用于逐行读取文本文件。

3. 文件写入:

  • 使用 fprintffputsfwrite 等函数将数据写入文件。
  • fprintf 用于按格式写入数据到文件,而 fputs 用于写入字符串。

4. 文件的打开与关闭:

  • 使用 fopen 函数打开文件,它需要指定文件名和打开模式(如读取、写入、追加等)。
  • 使用 fclose 函数关闭文件,确保在程序结束前关闭文件以避免数据丢失。

5. 二进制文件与文本文件:

  • C语言可以处理二进制文件和文本文件。
  • 二进制文件包含原始数据,而文本文件包含可读的字符数据。

字符读写、行读写、任意位置读写

字符读写、行读写和任意位置读写是在文件操作中的不同读写模式,它们的区别主要在于读写的粒度和操作方式

1. 字符读写:

字符读取(Character Reading):以字符为单位进行读取,每次读取一个字符。
字符写入(Character Writing):以字符为单位进行写入,每次写入一个字符。
优点:适用于处理文本文件,可以逐字符地读取和写入文本内容。
缺点:频繁的字符读写可能会导致性能问题,因为每次读取或写入都需要文件系统的调用,比较慢。

2. 行读写:

行读取(Line Reading):以行为单位进行读取,每次读取一行文本。
行写入(Line Writing):以行为单位进行写入,每次写入一行文本。
优点:适用于处理文本文件中的逐行数据,例如日志文件或配置文件。较字符读写更高效,因为它减少了文件系统调用的次数。
缺点:无法直接处理二进制文件,因为它依赖于文本文件中的行分隔符(通常是换行符)。

3. 任意位置读写:

任意位置读取(Random Access Reading):可以在文件中指定的位置读取数据,而不必按顺序。任意位置写入(Random Access Writing):可以在文件中指定的位置写入数据,而不必按顺序。
优点:适用于处理二进制文件或需要在文件中定位到特定位置进行读写的情况。允许随机访问和修改文件中的数据。
缺点:操作稍微复杂,需要使用 fseek 定位文件指针到所需的位置。

数据结构读写

1. 写入数据结构到文件:

要将数据结构写入文件,通常需要按照数据结构的布局将数据逐个写入文件。
首先,打开文件以进行写入操作:

FILE *file = fopen("data.dat", "wb"); // 以二进制写入模式打开文件
if (file == NULL) {
    perror("无法打开文件");
    return 1;
}

然后,使用 fwrite 函数将数据结构写入文件。假设有一个学生结构体:

struct Student {
    char name[50];
    int age;
    float grade;
};

struct Student student;
strcpy(student.name, "Alice");
student.age = 20;
student.grade = 85.5;

fwrite(&student, sizeof(struct Student), 1, file);

最后关闭文件:

FILE *file = fopen("data.dat", "rb"); // 以二进制读取模式打开文件
if (file == NULL) {
    perror("无法打开文件");
    return 1;
}

2. 从文件中读取数据结构:

要从文件中读取数据结构,首先需要打开文件以进行读取操作:

FILE *file = fopen("data.dat", "rb"); // 以二进制读取模式打开文件
if (file == NULL) {
    perror("无法打开文件");
    return 1;
}

然后,使用 fread 函数从文件中读取数据结构的内容:

struct Student student;
fread(&student, sizeof(struct Student), 1, file);

最后关闭文件。

结构化从文本文件操作

1. 定义结构体:

首先,需要定义一个结构体来表示你的数据结构。例如,如果要从文本文件中读取学生的信息,可以定义一个学生结构体如下:

struct Student {
    char name[50];
    int age;
    float grade;
};

2. 打开文件:

使用 fopen 函数来打开要读取或写入的文本文件。需要指定文件名和打开模式(读取、写入、追加等):

FILE *file = fopen("students.txt", "r"); // 以只读模式打开文件
if (file == NULL) {
    perror("无法打开文件");
    return 1;
}

3. 读取数据:

使用文件操作函数(例如 fscanf 或 fgets)来从文本文件中读取数据并将其存储到结构体中:

struct Student student;
while (fscanf(file, "%s %d %f", student.name, &student.age, &student.grade) != EOF) {
    // 处理读取到的数据,例如打印到屏幕
    printf("姓名: %s, 年龄: %d, 成绩: %.2f\n", student.name, student.age, student.grade);
}

4. 写入数据:

如果要将数据写入文本文件,可以使用 fprintf 函数。例将学生信息写入文件:

FILE *file = fopen("students.txt", "w"); // 以写入模式打开文件
if (file == NULL) {
    perror("无法打开文件");
    return 1;
}

struct Student student1 = {"Alice", 20, 85.5};
struct Student student2 = {"Bob", 22, 92.0};

fprintf(file, "%s %d %.2f\n", student1.name, student1.age, student1.grade);
fprintf(file, "%s %d %.2f\n", student2.name, student2.age, student2.grade);

fclose(file);

5. 关闭文件

二进制文件与文本文件转换

1. 从文本文件转换为二进制文件:

读取文本文件:首先,需要使用适当的文件读取方法(如fread 或 fgets)从文本文件中读取数据
解析文本数据:如果文本文件中的数据是结构化的(例如,CSV文件),则需要解析数据以将其转换为适当的数据结构,如结构体或数组。这通常涉及到分割文本行并将数据转换为相应的数据类型。
写入二进制文件:使用 fwrite 函数将解析后的数据写入到一个二进制文件中。确保指定正确的数据项大小和数量。
关闭文件:在完成转换后,关闭文件以释放资源。

FILE *textFile = fopen("data.txt", "r");
FILE *binaryFile = fopen("data.bin", "wb");

if (textFile == NULL || binaryFile == NULL) {
    perror("无法打开文件");
    return 1;
}

char line[100];
while (fgets(line, sizeof(line), textFile) != NULL) {
    // 解析数据并写入二进制文件
    // ...
}

fclose(textFile);
fclose(binaryFile);

2. 从二进制文件转换为文本文件:

读取二进制文件:首先,使用 fread 函数从二进制文件中读取数据。确保知道数据的结构以正确地读取数据。
编码数据:将读取的二进制数据编码为文本格式。这通常涉及将数字或二进制数据转换为字符。
写入文本文件:使用 fprintf 或 fputs 函数将编码后的数据写入文本文件中。
关闭文件:在完成转换后,关闭文件以释放资源。

FILE *binaryFile = fopen("data.bin", "rb");
FILE *textFile = fopen("data.txt", "w");

if (binaryFile == NULL || textFile == NULL) {
    perror("无法打开文件");
    return 1;
}

int value;
while (fread(&value, sizeof(int), 1, binaryFile) == 1) {
    // 编码数据并写入文本文件
    fprintf(textFile, "%d\n", value);
}

fclose(binaryFile);
fclose(textFile);

运用ChatGPT进行苏格拉底挑战,发现问题与解决思路

实践过程截图

标签:文件,file,读取,读写,写入,2024,文本文件,2023,20211327
From: https://www.cnblogs.com/shen-jianxiang/p/17708912.html

相关文章

  • 2023 JavaScript想进 BAT 的必须要面对的面试题
    2023JavaScript面试题以及答案在本文中,您将学习面试中最常见的JavaScript面试问题和答案。在继续学习JavaScript面试问题和答案之前,我们首先学习完整的JavaScript教程。JavaScript(JS)是使用最广泛的轻量级脚本和编译编程语言,具有一流的功能,由BrendenEich于1995年开发。众所周......
  • 2023.9.17日报
    今天了解了软考的相关内容,值得一提的是,软考的上午题中有很多没有学过的内容例如计算机组成原理和操作系统,另外自己的数据结构和计算机网络也有所遗忘因此需要往回捡捡,今天了解了一些cpu的知识点,还有一些编码的内容必须要记住的是,给出一个区间,例如用32kX8bit的芯片要用多少片......
  • NOI 2023 □□记
    2023.7.2x开考了。2023.7.2x考完了。2023.7.2x退役吗..?......其实记忆早以模糊,为何还要来回忆这一切呢?...2023.6.29被隐□的博□有趣的是,我在这个博中提到了dx,我并不知道我什么样的想法下提起的dx,在分数相差近100分的情况下。其实可以追溯更早。在nf......
  • NOI2024省选训练赛01
    NOI2024省选训练赛01时间:2023.9.16目录NOI2024省选训练赛01A.t3DescriptionConstraintsSolutionB.LifeDescriptionConstraintsSolutionA.t3TimeLimit:4sec/MemoryLimit:512MBDescription维护一个长度为\(n\)的数列\(a_i\),支持如下几种操作,操作有\(m\)次。\(1......
  • 「2023/09/15」选拔练习1
    VasyaandaTree题目描述:给定一颗n个点、点带权的树,根节点为1,初始时所有点的点权为0。有m次操作,每次操作给定三元组(v,d,x),将v子树中与v距离不超过d的所有点(包括点v)的点权加x。询问m次操作后所有点的点权。数据范围:\(1\len,m\le3\times10^5\)。做的时候一直在想怎么用树......
  • 2023.9.16
    今天想挨个找学长把我的之前的问题问清楚的,但是学长今天好像都有事,本来已经打算去问施润杰学长,结果在这之前我自己差不多把最关键的几个小问题想明白了,emmmm明天会继续到格式化字符串最后一个部分的学习,这些天加快速度,争取竞赛时能取得相较前几次较好的成绩。......
  • 2023年9月16日
    效果HTML<!DOCTYPEhtml><html> <head> <metacharset="utf-8"/> <title>2023年9月16日</title> <linkrel="stylesheet"href="./css/index_style.css"> </head> <body> <d......
  • 字符串杂题20230916
    今天的题目没有那么难,挑一些不蛮板的题目来讲。建议不要光看,打个草稿画一下图,这个是解字符串题的关键。[POI2005]SZA-Template题目描述你打算在纸上印一串字母。为了完成这项工作,你决定刻一个印章。印章每使用一次,就会将印章上的所有字母印到纸上。同一个位置的相同字符可以......
  • csp-s2023第一轮游记
    记录一下高二最后一次参加的初赛。2023.9.10放完半天假回学校发现这周六就初赛了,开始稍稍紧张了,不过还是踢了会球,搞点whk,下午最后一节课就直接跑机房了2023.9.11~2023.9.14白天上文化课抓紧写whk,不过因为化竞考完了,又临近信竞初赛,金导(去年国一,今年化竞省一的大佬)稍显不正常,一......
  • 20230916打卡
    我今天和室友一起点了披萨吃,这是我第一次尝试披萨。披萨非常好吃,我们很快就把它吃完了。下午,我花了一些时间玩原神游戏。原神超级好玩,我喜欢其中的角色和探索剧情。在游戏中,我可以放松自己,探索美丽的游戏世界,并与其他玩家一起完成任务和挑战。原神给我带来了许多乐趣和刺激。晚......