C语言文件操作(上)

news2025/1/15 6:23:10

文章目录

  • 一、为什么使用文件
  • 二、什么是文件
    • 1.程序文件
    • 2.数据文件
    • 3.文件名
  • 三、文件的打开与关闭
    • 1.文件指针
    • 2.文件的打开和关闭
      • fopen 与 fclose
  • 四、文件的顺序读写
    • 01 字符输出函数:fputs
    • 02 字符输入函数:fgetc
    • 03 文本行输出函数:fputs
    • 04 文本行输入函数:fgets
    • 05 格式化输出函数:fprintf
    • 06 格式化输入函数:fscanf
    • 07 二进制输出函数:fwrite
    • 08 二进制输入函数:fread
  • 五、 文件的随机读写
    • 01 文件指针定位函数:fseek
    • 02 返回偏移量函数:ftell
    • 03 文件指针回到起始位置函数:rewind
  • 六、 文本文件和二进制文件
    • 01 文本文件
    • 02 二进制文件
    • 03 数据在文件中的存储方式
  • 七、 文本结束的判定
    • 01 被错误使用的feof
    • 02 正确使用方式
  • 八、文件缓冲区


一、为什么使用文件

 在我们的一般程序中,我们所输入的数据都是存储在内存中的,当程序退出的时候,我们存储的数据也就相应消失了;那么,我们怎么才能做到完成相应数据的长时间存储呢?
 这就涉及到了数据持久化的问题,我们一般数据持久化的方法有:把数据存放在磁盘文件、存放到数据库等方式。使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。

二、什么是文件

 简单来讲,文件就是磁盘中的文件。
 但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。

1.程序文件

 包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。
比如说下图的文件就是程序文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.数据文件

 文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

比如下图中我们对某个文件进行读取或者输入数据,那么这个文件就是数据文件
在这里插入图片描述

3.文件名

 文件名存在的意义:作为一个文件惟一的文件标识,方便用户识别和引用。
 文件名包含:文件路径 + 文件名主干 + 文件后缀
 例如:(C:\code\test.text)
为了方便,文件标识通常被称为文件名

三、文件的打开与关闭

1.文件指针

 概念:每个被使用的文件都会在内存在开辟一个相应的文件信息区,用来存储于文件相关的信息(如:文件名、文件状态于文件当前位置);这些信息保存在一个结构体变量中,这个结构体变量由系统进行声明,称为FILE
在VS2013中是这样声明对的

struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
       };
typedef struct _iobuf FILE;

注意:
1、不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异
2、每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节
3、我们一般会通过一个 FILE 的指针来维护这个 FILE 结构的变量。并不会直接使用,而是拿一个结构体指针指向这个结构,通过这个指针来访问和维护相关的数据,这样使用起来会更加方便
 下面让我们来创建一个指针变量

FILE* pf;//文件指针变量

定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。
在这里插入图片描述

2.文件的打开和关闭

 文件的使用一般是:打开文件——>使用文件——>关闭文件
而我们打开与关闭文件需要用到两个函数:>fopen>fclose
这两个函数的头文件都是<stlib.h>

fopen 与 fclose

在这里插入图片描述
在这里插入图片描述
示例:

int main() {
	//打开文件
	FILE* p = fopen("test1.txt","r");
	if (p == NULL) {
		perror("fopen");
		return 1;
	}
	else {
		printf("yes\n");
	}

	//关闭文件
	fclose(p);
	p = NULL;
	return 0;
}

结果:
在这里插入图片描述

注意:不关闭文件的后果:一个程序能够打开的文件是有限的,文件属于一种资源。如果只打开不释放,文件就会被占用。可能会导致一些操作被缓冲在内存中,如果不能正常关闭,缓冲在内存中的数据就不能正常写入到文件中从而导致数据的丢失。

四、文件的顺序读写

 顺序读写,顾名思义就是按照顺序在文件中读和写。
 函数一览:
在这里插入图片描述

01 字符输出函数:fputs

//字符输出
int fputc(int character,FILE* stream);

将参数 character 指定的字符写入到指定的流 stream 中,并把位置标识符向前移动 (字符必须为一个无符号字符)。适用于所有输出流。
示例:

int main() {
	FILE* p = fopen("test1.txt", "w");
	if (p == NULL) {
		perror("fopen");
		return 1;
	}
    fputc('k',p);
	char ch = 0;
	for (ch = 'a'; ch < 'z'; ch++) {
		if (ch % 5 == 0) {
			fputc('\n', p);
		}
		fputc(ch, p);
	}
	fclose(p);
	p = NULL;
	return 0;
}

结果:
在这里插入图片描述
此外,我们在使用W 打开的时候还会有覆盖效果,让我们来尝试一下
我们把刚刚那段代码中关于字符输出的部分进行注释

int main() {
	FILE* p = fopen("test1.txt", "w");
	if (p == NULL) {
		perror("fopen");
		return 1;
	}
    /*fputc('k',p);
	char ch = 0;
	for (ch = 'a'; ch < 'z'; ch++) {
		if (ch % 5 == 0) {
			fputc('\n', p);
		}
		fputc(ch, p);
	}*/
	fclose(p);
	p = NULL;
	return 0;
}

结果:
在这里插入图片描述
结果我们发现文件中的内容被覆盖了,这就是 W 的覆盖效果

02 字符输入函数:fgetc

//字符输入
int fgetc(FILE* stream);

从指定的流 stream 获取下一个字符,并把位置标识符后移(字符必须为一个无符号字符)。如果读取成功会返回相应的ASCII码值,如果读取失败会返回一个EOF。适用于所有输入流。

示例:

 //使用fgetc读取文件
int main(void) {
    FILE* pf = fopen("test1.txt", "r");
    if (pf == NULL) {
        perror("fopen");
        return 1;
    }
     //读文件
    int ret = fgetc(pf);
    printf("%c\n", ret);
    ret = fgetc(pf);
    printf("%c\n", ret);
    ret = fgetc(pf);
    printf("%c\n", ret);

    fclose(pf);
    pf = NULL;

    return 0;
}

结果:
在这里插入图片描述
注意:在读取时要把文件打开方式变为“r”

03 文本行输出函数:fputs

//文本行输出
int fputs(const char* str, FILE* stream);

将字符串写入到指定的流 stream 中(不包括空字符)。适用于所有输出流。

示例:

int main() {
    FILE* pf = fopen("text2.txt","w");
    if (pf == NULL) {
        perror("fopen");
        return 1;
    }
    fputs("abcd",pf);
    char arr[] = "abcdefgh";
    fputs(arr,pf);
    fclose(pf);
    pf = NULL;
    return 0;
}

结果:
在这里插入图片描述

04 文本行输入函数:fgets

//文本输入函数
int fgets(char* str, int num, FILE* stream);

从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串中,当读取(n-1)个字符时,或者读取到换行符、到达文件末尾时,它会停止,具体视情况而定。适用于所有输入流。

示例:

int main() {
    FILE* pf = fopen("text2.txt","r");
    if (pf == NULL) {
        perror("fopen");
        return 1;
    }
    char arr[10];
    fgets(arr,4,pf);
    printf("%s\n",arr);
    fgets(arr, 4, pf);
    printf("%s\n", arr);
    fclose(pf);
    pf = NULL;
    return 0;
}

结果:
在这里插入图片描述
**注意:**假如 n 是100,读取到的就是99个字符(n-1),因为要留一个字符给斜杠0。

05 格式化输出函数:fprintf

用于对格式化的数据进行写文件,发送格式化输出到流 stream 中。适用于所有输出流。
示例:

struct test {
    char name[10];
    int age;
    char sex[4];
};
int main() {
    FILE* pf = fopen("text3.txt", "w");
    if (pf == NULL) {
        perror("fopen");
        return 1;
    }
    struct test ts = { "张三",18,"男"};
    fprintf(pf, "%s %d %s", ts.name, ts.age, ts.sex);

    fclose(pf);
    pf = NULL;
    return 0;
}

结果:
在这里插入图片描述

06 格式化输入函数:fscanf

//格式化输入函数
int fscanf(FILE* stream, const char* format, ...);

用于对格式化的数据进行读取,从流 stream 读取格式化输入。适用于所有输入流

示例:

struct test {
    char name[10];
    int age;
    char sex[4];
};
int main() {
    FILE* pf = fopen("text3.txt", "r");
    if (pf == NULL) {
        perror("fopen");
        return 1;
    }
    struct test ts = { 0 };
    fscanf(pf,"%s %d %s",ts.name,&(ts.age),ts.sex);
    printf("%s %d %s", ts.name, ts.age, ts.sex);
    fclose(pf);
    pf = NULL;
    return 0;
}

结果:
在这里插入图片描述

07 二进制输出函数:fwrite

//二进制输出函数
size_t fwrite(const void* ptr,size_t size,size_t count,FILE* stream);

将ptr指向的数据写入流stream中

示例:

struct test {
    char name[10];
    int age;
    char sex[4];
};
int main() {
    FILE* pf = fopen("text4.txt", "w");
    if (pf == NULL) {
        perror("fopen");
        return 1;
    }
    struct test ts = { "abcdef",22,"cdd"};
    fwrite(&ts,sizeof(struct test),1,pf);

    fclose(pf);
    pf = NULL;
    return 0;
}

结果:
在这里插入图片描述
结果显示我们输入的文字数据相显示的是乱码,让我们用二进制形式打开文件来检查一下
在这里插入图片描述
打开后结果:
在这里插入图片描述

原因:
我们刚才用的都是文本编译器,文本编译器打开二进制形式的文件完全是两种状态;对于字符串,以文本形式写进去和以二进制形式写进去是一样的;但是对于整数、浮点数等来说就不一样了,文本形式写入和二进制形式写入完全是两个概念。

08 二进制输入函数:fread

//二进制输入函数
size_t fread(void* ptr, size_t size, size_t count, FILE* stream);

将二进制数据从stream指向的文件流中读取到ptr指向的对象中

示例:

struct test {
    char name[10];
    int age;
    char sex[4];
};
int main() {
    FILE* pf = fopen("text4.txt", "r");
    if (pf == NULL) {
        perror("fopen");
        return 1;
    }
    struct test ts = { 0 };
    fread(&ts, sizeof(struct test), 1, pf);
    printf("%s %d %s\n",ts.name,ts.age,ts.sex);
    fclose(pf);
    pf = NULL;
    return 0;
}

结果:
在这里插入图片描述

五、 文件的随机读写

01 文件指针定位函数:fseek

//文件指针定位函数
int fseek(FILE* stream,long int offset,int origin);

根据文件指针的位置和偏移量来定位文件指针
a.参数:offset,是偏移量
b.origin是其实位置,一共有三个
 SEEK_CUR :当前文件指针位置
 SEEK_END :文件末尾位置
 SEEK_SET:文件起始位置

示例:

int main() {
	FILE* pf = fopen("text3.txt","r");
	if (pf == NULL) {
		perror("fopen"); 
		return 1;
	}

	int ch = fgetc(pf);
	printf("%c\n",ch);
	
	ch = fgetc(pf);
	printf("%c\n", ch);
	//从当前文件指针位置向前移动两个单位
	fseek(pf,-2,SEEK_CUR);
	ch = fgetc(pf);
	printf("%c\n", ch);

	fclose(pf);
	pf = NULL;

	return 0;
}

结果:
在这里插入图片描述

02 返回偏移量函数:ftell

//返回偏移量函数
long int ftell(FILE* stream);

返回当前文件指针相对于起始位置的偏移量

示例:

//返回文件指针相对于起始位置的偏移量
int main() {
	FILE* pf = fopen("text4.txt", "r");
	if (pf == NULL) {
		perror("fopen");
		return 1;
	}
	//调整文件指针位置
	fseek(pf,5,SEEK_SET);//使文件指针从起始位置右移5个单位

	int ch = fgetc(pf);
	printf("%c\n",ch);
	//返回文件指针所处位置的偏移量
	int ret = ftell(pf);
	printf("%d\n",ret);

	fclose(pf);
	pf = NULL;

	return 0;
}

结果:
在这里插入图片描述

03 文件指针回到起始位置函数:rewind

//使文件指针回到起始位置
void rewind(FILE* stream);

示例:

//返回文件指针相对于起始位置的偏移量
int main() {
	FILE* pf = fopen("text4.txt", "r");
	if (pf == NULL) {
		perror("fopen");
		return 1;
	}
	//调整文件指针位置
	fseek(pf,5,SEEK_SET);//使文件指针从起始位置右移5个单位

	int ch = fgetc(pf);
	printf("%c\n",ch);
	//返回文件指针所处位置的偏移量
	int ret = ftell(pf);
	printf("%d\n",ret);

	int arr[10];
	rewind(pf);
	fgets(arr,7,pf);
	printf("%s\n",arr);

	fclose(pf);
	pf = NULL;

	return 0;
}

结果:
在这里插入图片描述

六、 文本文件和二进制文件

根据数据的组织形式,数据文件被称为文本文件或者二进制文件。

01 文本文件

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。

02 二进制文件

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。

03 数据在文件中的存储方式

 存储方式:字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。

具体使用:
举个简单的例子:比如整数10000,如果以 ASCII 码的形式形式输出到磁盘,则磁盘中占用5个字节(每个字符占1个字节)。而如果以二进制的形式输出,则在磁盘上只占4个字节。

int main() {
	FILE* pf = fopen("text5.txt", "wb");
	if (pf == NULL) {
		perror("fopen");
		return 1;
	}
	
	int a = 10000;
	fwrite(&a,sizeof(int),1,pf);

	fclose(pf);
	pf = NULL;

	return 0;
}

以二进制形式打开文件:在这里插入图片描述
我们检验一下,这个数字是否是10000
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

七、 文本结束的判定

01 被错误使用的feof

 feof 函数介绍:在文件结束时,判断文件因为何种原因导致文件结束的函数,判断是因为读取失败而结束,还是因为遇到文件尾而结束。如果文件结束,则返回非0值,否则返回0。

 错误用途:feof 函数是个经常被错误使用的一个函数。在文件读取过程中,不能用 feof 函数的返回值直接判断文件是否结束!feof 函数绝对不是用来判断文件是否结束的函数!feof 不是用来判定文件是否结束了的,还是在文件已经结束时,判断是什么原因导致文件结束的。

 正确用途:当文件读取结束时,判断是因为读取失败而结束,还是因为遇到文件尾而结束。

int main() {
	FILE* pf = fopen("text4.txt", "r");
	if (pf == NULL) {
		perror("fopen");
		return 1;
	}

	int ch = 0;
	while ((ch = fgetc(pf)) != EOF) {
		putchar(ch);
	}
	printf("\n");

	if (ferror(pf)) {
		puts("文件读取失败");
	}
	else if (feof(pf)) {
		puts("遇到文件末尾停止");
	}

	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述

02 正确使用方式

文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
fgetc 判断是否为 EOF .
fgets 判断返回值是否为 NULL .
2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数。

八、文件缓冲区

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。
在这里插入图片描述
示例:

#include <stdio.h>
#include <windows.h>

int main()
{
	FILE* pf = fopen("test6.txt", "w");
	fputs("abcdef", pf);//先将代码放在输出缓冲区
	printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");
	Sleep(10000);
	printf("刷新缓冲区\n");
	fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)
	//注:fflush 在高版本的VS上不能使用了
	printf("再睡眠10秒-此时,再次打开test.txt文件,文件有内容了\n");
	Sleep(10000);
	fclose(pf);
	//注:fclose在关闭文件的时候,也会刷新缓冲区
	pf = NULL;
	return 0;
}

这里可以得出一个结论:
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。
如果不做,可能导致读写文件的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1104856.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络笔记】计算机网络性能(2)——时延带宽积、丢包率、吞吐量/率

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 系列文章目录时延带宽积丢包率吞吐量/率&am…

探讨Acrel-1000DP分布式光伏系统的设计与应用-安科瑞 蒋静

摘 要&#xff1a;分布式光伏发电特指在用户场地附近建设&#xff0c;运行方式以用户侧自发自用、余电上网&#xff0c;且在配电系统平衡调节为特征的光伏发电设施&#xff0c;是一种新型的、具有广阔发展前景的发电和能源综合利用方式&#xff0c;它倡导就近发电&#xff0c;就…

数据可视化工具 ,不会写 SQL 代码也能做数据分析

数据可视化工具可以帮助人们以直观、易于理解的方式展现和分析数据。这些工具使得即使不会写 SQL 代码的人也能进行数据分析&#xff0c;并从中获得有价值的信息和见解。 本文将详细介绍几种常用的数据可视化工具及其功能和优点。 1. Datainside: Datainside是一款流行的数…

jupyter崩溃OOM,out of memory,jupyter代码写不进去,保存不了。

最近写一个比较长的数据处理代码&#xff0c;有快千行&#xff0c;然后经常代码没有写入&#xff0c;然后直接网页崩溃&#xff0c;给我干蒙了。我已经是jupyter版本的问题&#xff0c;弄了半天&#xff0c;弄完&#xff0c;还是有这个问题。然后就查了一下&#xff0c;发现是j…

【操作系统】虚拟内存串讲

文章目录 概述虚拟页管理请求页表物理地址的获取虚拟页大小与内存块大小的探讨 概述 操作系统为每一个进程分配一个独立的虚拟内存空间&#xff0c;以分页系统为例&#xff0c;每个进程的虚拟页号都是从 0 开始的 不同的进程可以使用相同的虚拟页号&#xff0c;并且不会互相影…

Redis的BitMap实现分布式布隆过滤器

布隆过滤器&#xff08;Bloom Filter&#xff09;是一种高效的概率型数据结构&#xff0c;用于判断一个元素是否属于一个集合。它通过使用哈希函数和位数组来存储和查询数据&#xff0c;具有较快的插入和查询速度&#xff0c;并且占用空间相对较少。 引入依赖 <!--切面--&…

Spring Cloud 之 Feign 简介及简单DEMO的搭建

Feign简介&#xff1a; Feign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验。 Feign是在RestTemplate基础上封装的&#xff0c;使用注解的方式来声明一组与服务提供者Rest接口所对应的本地…

黑豹程序员-架构师学习路线图-百科:Maven

文章目录 1、什么是maven官网下载地址 2、发展历史3、Maven的伟大发明 1、什么是maven Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and…

微信小程序3

一、flex布局 布局的传统解决方案&#xff0c;基于[盒状模型]&#xff0c;依赖display属性 position属性 float属性 1、什么是flex布局&#xff1f; Flex是Flexible Box的缩写&#xff0c;意为”弹性布局”&#xff0c;用来为盒状模型提供最大的灵活性。 任何一个容器都可以…

同为科技(TOWE)工业用插头插座与连接器产品大全

TOWE IPS系列工业标准插头插座、连接器系列产品 随着国内经济快速的发展&#xff0c;人们生活水平的不断提高&#xff0c;基础设施的建设是发展的基础&#xff0c;完善的基础设施对加速经济的发展起到至关重要的作用。其中&#xff0c;基础建设中机场、港口、电力、通讯等公共…

GLEIF携手TrustAsia,共促数字邮件证书的信任与透明度升级

TrustAsia首次发布嵌入LEI的S/MIME证书&#xff0c;用于验证法定实体相关的电子邮件账户的真实与完整性 2023年10月&#xff0c;全球法人识别编码基金会&#xff08;GLEIF&#xff09;与证书颁发机构&#xff08;CA&#xff09;TrustAsia通力合作&#xff0c;双方就促进LEI在数…

基础课5——语音合成技术

TTS是语音合成技术的简称&#xff0c;也称为文语转换或语音到文本。它是指将文本转换为语音信号&#xff0c;并通过语音合成器生成可听的语音。TTS技术可以用于多种应用&#xff0c;例如智能语音助手、语音邮件、语音新闻、有声读物等。 TTS技术通常包括以下步骤&#xff1a; …

医学大数据分析 - 心血管疾病分析 计算机竞赛

文章目录 1 前言1 课题背景2 数据处理3 数据可视化4 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的心血管疾病分析 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9…

什么牌子的电容笔性价比高?电容笔牌子排行

在科技进步的同时&#xff0c;各种类型的电容笔也在国内的市场上涌现。一支好用的电容笔&#xff0c;不仅能让我们在学习上有很大的提高&#xff0c;而且还能让我们的工作效率大大提高。国产平替电容笔&#xff0c;在技术和品质上&#xff0c;都有很大的改进余地&#xff0c;起…

如何才能拥有大量的虾皮印尼买家号?

注册虾皮印尼买家号还是比较简单的&#xff0c;直接打开shopee印尼官网&#xff0c;点击注册&#xff0c;输入手机号&#xff0c;接收短信&#xff0c;然后再设置一个密码就可以了。 如果想要注册多个虾皮买家号&#xff0c;那么要借助软件操作才可以&#xff0c;比如shopee买家…

本地项目打jar包依赖并上传到maven仓库

一、 打jar包依赖 先去掉启动类pom中添加如下的maven打包插件 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version><c…

RN:报错info Opening flipper://null/React?device=React%20Native

背景 在 ios 上使用 debug 模式的时候&#xff0c;报错&#xff1a;info Opening flipper://null/React?deviceReact%20Native&#xff0c;我找到了这个 issue 其实也可以看到现在打开 debug&#xff0c;是 open debug&#xff0c;也不是之前的 debug for chrome 了&#xf…

【Arduino TFT】 记录使用DMA优化TFT屏帧率

忘记过去&#xff0c;超越自己 ❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-10-18 ❤️❤️ 本篇更新记录 2023-10-18 ❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &#x1f44d;收藏 ⭐️留言&#x1f4dd;&#x1f64…

软件外包开发设计文档

编写软件设计文档是项目开发过程中的关键步骤&#xff0c;它有助于明确系统的设计和架构&#xff0c;并为开发人员提供指导。以下是编写软件设计文档的一般步骤和建议&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;…

Python中Scrapy框架搭建ip代理池教程

在网络爬虫开发中&#xff0c;使用代理IP池可以提高爬取效率和匿名性&#xff0c;避免被目标网站封禁IP。本文将介绍如何使用Python中的Scrapy框架搭建IP代理池&#xff0c;并提供代码实例&#xff0c;帮助您快速搭建一个稳定可靠的代理池。 Python中Scrapy框架搭建ip代理池教程…