【C语言】文件管理<2>

目录

1.文件的随机读写

fseek

ftell

fwind

2.文本文件与二进制文件

3.文件读取结束的判定

判断文件是否读取访问结束

判断文件结束的原因

缓冲区


📢1.文件的随机读写

📢fseek

📢📢只读模式

文件操纵使用 fgetc ,以只读模式访问文件时

默认会从第一个元素开始读取,然后向后访问,具体如下代码

//fseek函数的使用
#include<stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
	FILE* fp=fopen("test.txt","r");
	if (fp == NULL)
	{
		printf("%s", strerror(errno));
		return 0;
	}
	int ch = fgetc(fp);
	printf("%c ", ch);  //a
	ch = fgetc(fp);
	printf("%c ", ch);  //b
	ch = fgetc(fp);
	printf("%c ", ch);  //c
    fclose(fp);
    fp=NULL;
	return 0;
}

怎样随机读取文件的字母

也就是说,读取c后下一个字母可以直接访问到 'f'

能实现这个功能的函数为fseek

	fseek(fp, 2, SEEK_CUR);
	ch=fgetc(fp);
	printf("%c", ch);
	fseek(fp, 5, SEEK_SET);
	ch = fgetc(fp);
	printf("%c", ch);
	fseek(fp, -1, SEEK_END);

                            fseek
头文件               #include <stdio.h>
格式                    int fseek ( FILE * stream, long int offset, int origin )
功能                    通过偏移量来定位文件指针
返回值                 如果成功,该函数返回零;否则,它将返回非零值。

这里第三个参数(origin)的起始位置有三种情况

参数起始位置
SEEK_SET文件开头
SEEK_CUR文件指针当前位置
SEEK_CUR文件结束的位置

📢只写模式

📢通过fseek函数将‘y’改成‘&’

#include<stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
	FILE* fp=fopen("test.txt","w");
	if (fp == NULL)
	{
		printf("%s", strerror(errno));
		return 0;
	}
	int ch = 0;
	for (ch = 'a'; ch <= 'z'; ch++)
		fputc(ch, fp);
	fseek(fp, -2, SEEK_CUR);
	fputc('&', fp);

	fp = NULL;
	return 0;
}

📢ftell

当对文件进行读写模式的时候,有时候就会忘记文件指针指向的是哪里

或者说,距离起始位置的偏移量是多少,就要用到ftell函数

//ftell函数的使用
#include<stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
	FILE* fp=fopen("test.txt","r");
	if (fp == NULL)
	{
		printf("%s", strerror(errno));
		return 0;
	}
	int ch = fgetc(fp);//a
	ch = fgetc(fp);    //b
	ch = fgetc(fp);    //c
	int Move = ftell(fp);
	printf("距离起始位置的偏移量为:>% d", Move);
	fclose(fp);
	fp = NULL;
	return 0;
}

                            ftell
头文件               #include <stdio.h>
格式                    long int ftell ( FILE * stream )
功能                    计算距离起始位置的偏移量
返回值                 成功时,返回文件指针的当前值,失败时,返回 -1

📢fwind

当文件指针指向的位置不再是起始位置

可以通过fwind是指针返回到起始位置

//rewind函数的使用
#include<stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
	FILE* fp=fopen("test.txt","r");
	if (fp == NULL)
	{
		printf("%s", strerror(errno));
		return 0;
	}
	int ch = fgetc(fp);//a
	ch = fgetc(fp);    //b
	ch = fgetc(fp);    //c
	int Move = ftell(fp);
	printf("距离起始位置的偏移量为:>% d\n", Move);
	rewind(fp);
	Move = ftell(fp);
	printf("距离起始位置的偏移量为:>% d", Move);
	fclose(fp);
	fp = NULL;
	return 0;
}

📢2.文本文件与二进制文件

文件数据的储存方式可以分为文本文件与二进制文件

内存中的数据都是以二级制的形式储存在内存中

如果将内存中的数据,不加以转化,输出到外存,就是二级制文件

如果以ASCll码的形式储存在外存,就称为文本文件

话句话说,一般情况,只要是你看得懂的文件都是文本文件,反之就是二进制文件 

 如果能用记事本打开并能理解其中的内容的文件就是文本文件

📢3.文件读取结束的判定

📢判断文件是否读取访问结束

📢文本文件

fgetc函数的返回值为EOF,可以判断文件的返回值是否为EOF来判断文件的状态

fputs函数的返回值为NULL,可以判断文件的返回值是否为空指针来判断文件的状态

📢二进制文件

fread函数可以判断文件元素读取的理论数量与实际返回值进行对比

如果此返回值与 count 参数不同,则表示读取时出现读取错误或到达文件末尾

                            fread
头文件               #include <stdio.h>
格式                    size_t fread ( void * ptr, size_t size, size_t count, FILE * stream )
功能                    从流中读取数据块
返回值                 将返回成功读取的元素总数

📢判断文件结束的原因

原因可以使用feof函数来判断文件结束的原因

注:不能用feof来判断是否结束

下面给出判断文本文件结束的原因代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int c;//注意:int,非char,要求处理EOF
FILE* fp = fopen("test.txt", "r");
if (!fp) {
	perror("File opening failed");
	return EXIT_FAILURE;
}
		//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
	while ((c = fgetc(fp)) != EOF)
	{
		putchar(c);
	}
	//判断是什么原因结束的
		if (ferror(fp))
			puts("I/0 error when reading");
		else if (feof(fp))
			puts("End of file reached successfully");
	fclose(fp);
	fp == NULL;
	return 0;
}

📢缓冲区

首先缓冲区的存在,是为了集中要处理的问题,进行一次性解决

就比如请教老师,可以先把需要请教的问题收集起来,进行一次性询问,这样可以避免浪费老师的时间,缓冲区的存在也是一样的原理,避免操作系统过于繁忙

 如果需要快速处理这些数据

也可以刷新缓冲区,就是释放缓冲区这些问题,使这些数据快速得以读取和访问

强行(清空)刷新缓冲区的函数fflush

                            fflush
头文件               #include <stdio.h>
格式                    int fflush ( FILE * stream )
功能                    刷新缓冲区
返回值                 如果写入错误就返回EOF,反之返回0

欢迎点赞收藏加关注,如若有问题可以提出来😁😁😁😁

  • 51
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 38
    评论
### 回答1: C++中可以使用fstream读取txt文件并解析到vector<string>中。 代码示例如下: ```c++ #include <fstream> #include <string> #include <vector> using namespace std; int main() { vector<string> lines; string line; ifstream infile("example.txt"); while (getline(infile, line)) { lines.push_back(line); } infile.close(); //遍历vector for (int i = 0; i < lines.size(); i++) { cout << lines[i] << endl; } return 0; } ``` 其中,"example.txt"是需要读取的文件名。 另外还可以使用 C standard library 中的 fopen 和 fgets 读取文件,解析到vector<string>中。 代码示例如下: ```c++ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <vector> using namespace std; int main() { vector<string> lines; char line[1024]; FILE *file = fopen("example.txt", "r"); if (file == NULL) { perror("Error opening file"); return(-1); } while (fgets(line, sizeof(line), file)) { lines.push_back(line); } fclose(file); //遍历vector for (int i = 0; i < lines.size(); i++) { printf("%s", lines[i].c_str()); } return 0; } ``` ### 回答2: 在C语言中,要读取txt文件并将其解析为vector<string>格式,可以采用以下步骤: 1. 首先,需要包含相关的头文件,例如stdio.h和stdlib.h。这些头文件包含了一些用于文件操作的函数。 2. 创建一个FILE指针,用于打开和读取txt文件。可以使用fopen函数打开文件,并使用相应的模式(例如"r"表示只读方式打开文件)。 3. 创建一个vector<string>类型的变量,用于存储读取的文本行。可以使用vector容器来动态管理字符串数组。 4. 使用fgets函数从文件中逐行读取文本数据。可以使用循环来逐行读取整个文件内容,直到文件结尾。 5. 在每次读取到的文本行后,将其存储到vector<string>变量中。可以使用push_back函数将字符串添加到vector的末尾。 6. 当文件读取完毕后,关闭文件指针,使用fclose函数关闭已打开的文件。 7. 最后,可以通过遍历vector<string>来输出读取到的文本行,或者在需要的地方对文本行进行进一步处理。 下面是一个简单的示例代码,演示了如何在C语言中实现以上步骤: ```c #include <stdio.h> #include <stdlib.h> #include <vector> int main() { FILE *fp; char line[256]; std::vector<std::string> lines; // 打开txt文件 fp = fopen("example.txt", "r"); if (fp == NULL) { printf("无法打开文件\n"); return 1; } // 逐行读取文本数据 while (fgets(line, sizeof(line), fp)) { // 存储文本行到vector中 lines.push_back(line); } // 关闭文件 fclose(fp); // 输出读取到的文本行 for (int i = 0; i < lines.size(); i++) { printf("第%d行:%s", i+1, lines[i].c_str()); } return 0; } ``` 这样,在C语言中我们就可以读取txt文件并将其解析为vector<string>格式了。 ### 回答3: 在C语言中读取txt文件并将其解析为vector<string>格式,可以通过以下步骤实现: 1. 打开文件:首先需要使用C语言文件操作函数打开要读取的txt文件。可以使用fopen函数来完成此操作。例如,可以使用以下代码打开名为"example.txt"的文件: ```c FILE* file = fopen("example.txt", "r"); ``` 2. 读取文件内容:使用fgets函数逐行读取文件的内容。可以使用一个字符数组(例如char buffer[256])来存储每行的内容。fgets函数每次读取一行,直到文件结束。例如,可以使用以下代码读取文件内容: ```c char buffer[256]; while (fgets(buffer, sizeof(buffer), file)) { // 进行处理 } ``` 3. 解析内容为vector<string>格式:将读取的每行内容解析为string类型,并依次存储到vector<string>中。可以使用C++标准库的string类和vector容器来完成此操作。例如,可以使用以下代码将每行内容存储到vector<string>中: ```c #include <vector> #include <string> std::vector<std::string> lines; char buffer[256]; while (fgets(buffer, sizeof(buffer), file)) { std::string line(buffer); lines.push_back(line); } ``` 4. 关闭文件:完成文件的读取后,需要使用fclose函数关闭文件。例如,可以使用以下代码关闭文件: ```c fclose(file); ``` 通过以上步骤,可以在C语言中读取txt文件并将其解析为vector<string>格式。在解析之后,可以对vector<string>进行进一步的操作和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值