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

C语言文件操作 | 文件分类、文件打开与关闭、文件的读写、文件状态、文件删除与重命名、文件缓冲区

在这里插入图片描述

欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。


C语言文件操作 | 文件分类、文件打开与关闭、文件的读写、文件状态、文件删除与重命名、文件缓冲区

  • 文件的分类
    • 磁盘文件的分类
    • 文本文件和二进制文件
  • 文件的打开和关闭
    • 文件指针
    • 文件的打开
    • 文件的关闭
  • 文件的顺序读写
    • 按照字符读写文件fgetc、fputc
    • 按照行读写文件fgets、fputs
    • 按照格式化文件fprintf、fscanf
    • 按照块读写文件fread、fwrite
  • 文件的随机读写
  • Windows和Linux文本文件区别
  • 获取文件状态
  • 删除文件、重命名文件名
  • 文件缓冲区
    • 文件缓冲区
    • 磁盘文件的存取
    • 更新缓冲区


专栏:《精通C语言》


文件的分类

磁盘文件和设备文件

  • 磁盘文件
    指一组相关数据的有序集合,通常存储在外部介质(如磁盘)上,使用时才调入内存。

  • 设备文件
    在操作系统中把每一个与主机相连的输入、输出设备看作是一个文件,把它们的输入、输出等同于对磁盘文件的读和写。

磁盘文件的分类

计算机的存储在物理上是二进制的,所以物理上所有的磁盘文件本质上都是一样的:以字节为单位进行顺序存储。
在这里插入图片描述

从用户或者操作系统使用的角度(逻辑上)把文件分为:

  • 文本文件:基于字符编码的文件
  • 二进制文件:基于值编码的文件

文本文件和二进制文件

文本文件

  • 基于字符编码,常见编码有ASCII、UNICODE等
  • 一般可以使用文本编辑器直接打开
  • 数5678的以ASCII存储形式(ASCII码)为:
    00110101 00110110 00110111 00111000

二进制文件

  • 基于值编码,自己根据具体应用,指定某个值是什么意思
  • 把内存中的数据按其在内存中的存储形式原样输出到磁盘上
  • 数5678的存储形式(二进制码)为:00010110 00101110

文件的打开和关闭

文件指针

在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。

typedef struct
{short           level;	//缓冲区"满"或者"空"的程度 unsigned        flags;	//文件状态标志 char            fd;		//文件描述符unsigned char   hold;	//如无缓冲区不读取字符short           bsize;	//缓冲区的大小unsigned char   *buffer;//数据缓冲区的位置 unsigned        ar;	 //指针,当前的指向 unsigned        istemp;	//临时文件,指示器short           token;	//用于有效性的检查 
}FILE;

FILE是系统使用typedef定义出来的有关文件信息的一种结构体类型,结构中含有文件名、文件状态和文件当前位置等信息。

声明FILE结构体类型的信息包含在头文件“stdio.h”中,一般设置一个指向FILE类型变量的指针变量,然后通过它来引用这些FILE类型变量。通过文件指针就可对它所指的文件进行各种操作。

在这里插入图片描述

C语言中有三个特殊的文件指针由系统默认打开,用户无需定义即可直接使用:

  • stdin: 标准输入,默认为当前终端(键盘),我们使用的scanf、getchar函数默认从此终端获得数据。
  • stdout:标准输出,默认为当前终端(屏幕),我们使用的printf、puts函数默认输出信息到此终端。
  • stderr:标准出错,默认为当前终端(屏幕),我们使用的perror函数默认输出信息到此终端。

文件的打开

任何文件使用之前必须打开:

#include <stdio.h>
FILE * fopen(const char * filename, const char * mode);
功能:打开文件
参数:filename:需要打开的文件名,根据需要加上路径mode:打开文件的模式设置
返回值:成功:文件指针失败:NULL

第一个参数的几种形式:

	FILE *fp_passwd = NULL;//相对路径://打开当前目录passdw文件:源文件(源程序)所在目录FILE *fp_passwd = fopen("passwd.txt", "r");//打开当前目录(test)下passwd.txt文件fp_passwd = fopen(". / test / passwd.txt", "r");//打开当前目录上一级目录(相对当前目录)passwd.txt文件fp_passwd = fopen(".. / passwd.txt", "r");//绝对路径://打开C盘test目录下一个叫passwd.txt文件fp_passwd = fopen("c://test//passwd.txt","r");

第二个参数的几种形式(打开文件的方式):

打开模式含义
r或rb以只读方式打开一个文本文件(不创建文件,若文件不存在则报错)
w或wb以写方式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件)
a或ab以追加方式打开文件,在末尾添加内容,若文件不存在则创建文件
r+或rb+以可读、可写的方式打开文件(不创建新文件)
r+或rb+以可读、可写的方式打开文件(不创建新文件)
w+或wb+以可读、可写的方式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件)
a+或ab+以添加方式打开文件,打开文件并在末尾更改文件,若文件不存在则创建文件

注意:

  • b是二进制模式的意思,b只是在Windows有效,在Linux用r和rb的结果是一样的。
  • Unix和Linux下所有的文本文件行都是\n结尾,而Windows所有的文本文件行都是\r\n结尾。
  • 在Windows平台下,以“文本”方式打开文件,不加b:
    当读取文件的时候,系统会将所有的 “\r\n” 转换成 “\n”;
    当写入文件的时候,系统会将 “\n” 转换成 “\r\n” 写入 ;
    以"二进制"方式打开文件,则读\写都不会进行这样的转换。
  • 在Unix/Linux平台下,“文本”与“二进制”模式没有区别,“\r\n” 作为两个字符原样输入输出。
int main(void)
{FILE *fp = NULL;// "\\"这样的路径形式,只能在windows使用// "/"这样的路径形式,windows和linux平台下都可用,建议使用这种// 路径可以是相对路径,也可是绝对路径fp = fopen("../test", "w");//fp = fopen("..\\test", "w");if (fp == NULL) //返回空,说明打开失败{//perror()是标准出错打印函数,能打印调用库函数出错原因perror("open");return -1;}return 0;
}

文件的关闭

任何文件在使用后应该关闭:

  • 打开的文件会占用内存资源,如果总是打开不关闭,会消耗很多内存。
  • 一个进程同时打开的文件数是有限制的,超过最大同时打开文件数,再次调用fopen打开文件会失败。
  • 如果没有明确的调用fclose关闭打开的文件,那么程序在退出的时候,操作系统会统一关闭。
#include <stdio.h>
int fclose(FILE * stream);
功能:关闭先前fopen()打开的文件。此动作让缓冲区的数据写入文件中,并释放系统所提供的文件资源。
参数:stream:文件指针
返回值:成功:0失败:-1FILE * fp = NULL;fp = fopen("abc.txt", "r");fclose(fp);

文件的顺序读写

按照字符读写文件fgetc、fputc

写文件

#include <stdio.h>
int fputc(int ch, FILE * stream);
功能:将ch转换为unsigned char后写入stream指定的文件中
参数:ch:需要写入文件的字符stream:文件指针
返回值:成功:成功写入文件的字符失败:返回-1
char buf[] = "this is a test for fputc";
int i = 0;
int n = strlen(buf);
for (i = 0; i < n; i++)
{//往文件fp写入字符buf[i]int ch = fputc(buf[i], fp);printf("ch = %c\n", ch);
}

文件结尾
在C语言中,EOF表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。

#define EOF     (-1)

当把数据以二进制形式存放到文件中时,就会有-1值的出现,因此不能采用EOF作为二进制文件的结束标志。为解决这一个问题,ANSI C提供一个feof函数,用来判断文件是否结束。feof函数既可用以判断二进制文件又可用以判断文本文件。

#include <stdio.h>
int feof(FILE * stream);
功能:检测是否读取到了文件结尾。判断的是最后一次“读操作的内容”,不是当前位置内容(上一个内容)。
参数:stream:文件指针
返回值:非0值:已经到文件结尾0:没有到文件结尾

读文件

#include <stdio.h>
int fgetc(FILE * stream);
功能:从stream指定的文件中读取一个字符
参数:stream:文件指针
返回值:成功:返回读取到的字符失败:-1
char ch;
#if 0
while ((ch = fgetc(fp)) != EOF)
{printf("%c", ch);
}
printf("\n");
#endifwhile (!feof(fp)) //文件没有结束,则执行循环
{ch = fgetc(fp);printf("%c", ch);
}
printf("\n");

按照行读写文件fgets、fputs

写文件

#include <stdio.h>
int fputs(const char * str, FILE * stream);
功能:将str所指定的字符串写入到stream指定的文件中,字符串结束符 '\0'  不写入文件。 
参数:str:字符串stream:文件指针
返回值:成功:0失败:-1
char *buf[] = { "123456\n", "bbbbbbbbbb\n", "ccccccccccc\n" };
int i = 0;
int n = 3;
for (i = 0; i < n; i++)
{int len = fputs(buf[i], fp);printf("len = %d\n", len);
}

读文件

#include <stdio.h>
char * fgets(char * str, int size, FILE * stream);
功能:从stream指定的文件内读入字符,保存到str所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size - 1个字符为止,最后会自动加上字符 '\0' 作为字符串结束。
参数:str:字符串size:指定最大读取字符串的长度(size - 1)stream:文件指针
返回值:成功:成功读取的字符串读到文件尾或出错: NULL
char buf[100] = 0;while (!feof(fp)) //文件没有结束
{memset(buf, 0, sizeof(buf));char *p = fgets(buf, sizeof(buf), fp);if (p != NULL){printf("buf = %s", buf);}
}

按照格式化文件fprintf、fscanf

写文件

#include <stdio.h>
int fprintf(FILE * stream, const char * format, ...);
功能:根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符 '\0'  为止。
参数:stream:已经打开的文件format:字符串格式,用法和printf()一样
返回值:成功:实际写入文件的字符个数失败:-1
fprintf(fp, "%d %d %d\n", 1, 2, 3);

读文件

#include <stdio.h>
int fscanf(FILE * stream, const char * format, ...);
功能:从stream指定的文件读取字符串,并根据参数format字符串来转换并格式化数据。
参数:stream:已经打开的文件format:字符串格式,用法和scanf()一样
返回值:成功:参数数目,成功转换的值的个数失败: - 1
int a = 0;
int b = 0;
int c = 0;
fscanf(fp, "%d %d %d\n", &a, &b, &c);
printf("a = %d, b = %d, c = %d\n", a, b, c);

按照块读写文件fread、fwrite

写文件

#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:以数据块的方式给文件写入内容
参数:ptr:准备写入文件数据的地址size: size_tunsigned int类型,此参数指定写入文件内容的块数据大小nmemb:写入文件的块数,写入文件数据总大小为:size * nmembstream:已经打开的文件指针
返回值:成功:实际成功写入文件数据的块数目,此值和nmemb相等失败:0
typedef struct Stu
{char name[50];int id;
}Stu;Stu s[3];
int i = 0;
for (i = 0; i < 3; i++)
{sprintf(s[i].name, "stu%d%d%d", i, i, i);s[i].id = i + 1;
}int ret = fwrite(s, sizeof(Stu), 3, fp);
printf("ret = %d\n", ret);

读文件

#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:以数据块的方式从文件中读取内容
参数:ptr:存放读取出来数据的内存空间size: size_tunsigned int类型,此参数指定读取文件内容的块数据大小nmemb:读取文件的块数,读取文件数据总大小为:size * nmembstream:已经打开的文件指针
返回值:成功:实际成功读取到内容的块数,如果此值比nmemb小,但大于0,说明读到文件的结尾。失败:0
typedef struct Stu
{char name[50];int id;
}Stu;Stu s[3];
int ret = fread(s, sizeof(Stu), 3, fp);
printf("ret = %d\n", ret);int i = 0;
for (i = 0; i < 3; i++)
{printf("s = %s, %d\n", s[i].name, s[i].id);
}

文件的随机读写

#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
功能:移动文件流(文件光标)的读写位置。
参数:stream:已经打开的文件指针offset:根据whence来移动的位移数(偏移量),可以是正数,也可以负数,如果正数,则相对于whence往右移动,如果是负数,则相对于whence往左移动。如果向前移动的字节数超过了文件开头则出错返回,如果向后移动的字节数超过了文件末尾,再次写入时将增大文件尺寸。whence:其取值如下:SEEK_SET:从文件开头移动offset个字节SEEK_CUR:从当前位置移动offset个字节SEEK_END:从文件末尾移动offset个字节
返回值:成功:0失败:-1#include <stdio.h>
long ftell(FILE *stream);
功能:获取文件流(文件光标)的读写位置。
参数:stream:已经打开的文件指针
返回值:成功:当前文件流(文件光标)的读写位置失败:-1#include <stdio.h>
void rewind(FILE *stream);
功能:把文件流(文件光标)的读写位置移动到文件开头。
参数:stream:已经打开的文件指针
返回值:无返回值
typedef struct Stu
{char name[50];int id;
}Stu;//假如已经往文件写入3个结构体
//fwrite(s, sizeof(Stu), 3, fp);Stu s[3];
Stu tmp; 
int ret = 0;//文件光标读写位置从开头往右移动2个结构体的位置
fseek(fp, 2 * sizeof(Stu), SEEK_SET);//读第3个结构体
ret = fread(&tmp, sizeof(Stu), 1, fp);
if (ret == 1)
{printf("[tmp]%s, %d\n", tmp.name, tmp.id);
}//把文件光标移动到文件开头
//fseek(fp, 0, SEEK_SET);
rewind(fp);ret = fread(s, sizeof(Stu), 3, fp);
printf("ret = %d\n", ret);int i = 0;
for (i = 0; i < 3; i++)
{printf("s === %s, %d\n", s[i].name, s[i].id);
}

Windows和Linux文本文件区别

  • b是二进制模式的意思,b只是在Windows有效,在Linux用r和rb的结果是一样的。
  • Unix和Linux下所有的文本文件行都是\n结尾,而Windows所有的文本文件行都是\r\n结尾。
  • 在Windows平台下,以“文本”方式打开文件,不加b:
    当读取文件的时候,系统会将所有的 “\r\n” 转换成 “\n”;
    当写入文件的时候,系统会将 “\n” 转换成 “\r\n” 写入 ;
    以"二进制"方式打开文件,则读\写都不会进行这样的转换。
  • 在Unix/Linux平台下,“文本”与“二进制”模式没有区别,“\r\n” 作为两个字符原样输入输出。

判断文本文件是Linux格式还是Windows格式:

#include<stdio.h>int main(int argc, char **args)
{if (argc < 2)return 0;FILE *p = fopen(args[1], "rb");if (!p)return 0;char a[1024] = { 0 };fgets(a, sizeof(a), p);int len = 0;while (a[len]){if (a[len] == '\n'){if (a[len - 1] == '\r'){printf("windows file\n");}else{printf("linux file\n");}}len++;}fclose(p);return 0;
}

获取文件状态

#include <sys/types.h>
#include <sys/stat.h>
int stat(const char *path, struct stat *buf);
功能:获取文件状态信息
参数:
path:文件名
buf:保存文件信息的结构体
返回值:
成功:0
失败-1
struct stat {dev_t         st_dev;         //文件的设备编号ino_t         st_ino;          //节点mode_t        st_mode;   //文件的类型和存取的权限nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1uid_t         st_uid;         //用户IDgid_t         st_gid;         //组IDdev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号off_t         st_size;        //文件字节数(文件大小)unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)unsigned long st_blocks;    //块数time_t        st_atime;     //最后一次访问时间time_t        st_mtime;    //最后一次修改时间time_t        st_ctime;     //最后一次改变时间(指属性)
};
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>int main(int argc, char **args)
{if (argc < 2)return 0;struct stat st = { 0 };stat(args[1], &st);int size = st.st_size;//得到结构体中的成员变量printf("%d\n", size);return 0;
}

删除文件、重命名文件名

#include <stdio.h>
int remove(const char *pathname);
功能:删除文件
参数:pathname:文件名
返回值:成功:0失败:-1#include <stdio.h>
int rename(const char *oldpath, const char *newpath);
功能:把oldpath的文件名改为newpath
参数:
oldpath:旧文件名
newpath:新文件名
返回值:
成功:0
失败: - 1

文件缓冲区

文件缓冲区

ANSI C标准采用“缓冲文件系统”处理数据文件。

所谓缓冲文件系统是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。

如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量) 。

磁盘文件的存取

在这里插入图片描述

  • 磁盘文件,一般保存在硬盘、U盘等掉电不丢失的磁盘设备中,在需要时调入内存。
  • 在内存中对文件进行编辑处理后,保存到磁盘中。
  • 程序与磁盘之间交互,不是立即完成,系统或程序可根据需要设置缓冲区,以提高存取效率。

更新缓冲区

#include <stdio.h>
int fflush(FILE *stream);
功能:更新缓冲区,让缓冲区的数据立马写到文件中。
参数:
stream:文件指针
返回值:
成功:0
失败:-1

在这里插入图片描述
在这里插入图片描述


相关文章:

C语言文件操作 | 文件分类、文件打开与关闭、文件的读写、文件状态、文件删除与重命名、文件缓冲区

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…...

从零开始的c语言日记day37——数组指针练习

一、 取地址数组储存在了*p里&#xff0c;里面储存的是整个数组的地址但本质也是第一个元素的地址解引用后1为4个字节所以就可以打印数组了。但一般不用这种方法 这样更方便一些 打印多维数组 如果不用这样传参&#xff0c;用指针传参怎么做呢&#xff1f; Main里函数的arr表示…...

codeforces 1851F

题目链接 题目大意&#xff1a;给你一个长度为n的数组a, 和一个整数k(2<n<2e5, k<30, a[i]<pow(2,k))。 任选一个x&#xff0c;求(a[i] ^ x) & (a[j] ^ x) 的最大值(1<i,j<n, i!j, x<pow(2,k))。 由于中间有个&&#xff0c;所以我们要求两个数最高…...

js把格式为YYYY-MM-DD HH:mm:ss的时间转换为UTC时间ISO 8601格式

// 要转换的日期字符串 const inputDate 2023-11-25 14:54:01; // 将日期字符串转换为Date对象 const dateObj new Date(inputDate); // 获取时间戳&#xff08;毫秒&#xff09; const timestamp dateObj.getTime(); // 转换格式 const outputDate new Date(tim…...

使用 Java 来读取 Excel 文件,检查每一行中的 URL,并将不符合条件的行标记为红色

-- 日、时、分、秒&#xff0c;这是计时的单位&#xff0c;惜时就应该惜日、惜时、惜分、惜秒。 用 Java 来读取 Excel 文件&#xff0c;检查每一行中的 URL&#xff0c;并将不符合条件的行标记为红色。以下是一个简单的示例&#xff0c;使用 Apache POI 进行 Excel 操作&#…...

雷达公式实现(matlab)

雷达公式实现 代码来源&#xff1a;《雷达系统分析与设计(MATLAB版)(第三版)》 function [snr] radar_eq(pt,freq,g,sigma,b,nf,loss,range) % This program implements Eq.(1.63) %% Inputs:% pt——峰值功率&#xff0c;W% freq——雷达中心频率&#xff0c;Hz% g——天线…...

CMake构建一个转换为3d tile的开源代码成功

之前CMake构建一个转换为3d tile的开源代码&#xff0c;生成解决方案之后&#xff0c;从VS2019打开&#xff1b; 总是报一个错误&#xff0c;跟 mocs_compilation_Debug.cpp 这个QT相关文件有关&#xff0c;它生成的obj&#xff0c;总是报模块计算机x64和目标计算机x86冲突&am…...

Java线程通信

线程通信 案例 package com.itheima.d4;public class ThreadTest {public static void main(String[] args) {Desk desk new Desk();//创建3个生产者线程new Thread(() -> {while (true) {desk.put();}}, "厨师1").start();new Thread(() -> {while (true) {…...

计算4人队形的最可能分布

2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 1 2 2 3 3 3 x 3 3 2 2 2 1 2 2 2 2 2 1 2 2 在6*6的平面上2个点随机分布&#xff0c;有3种分布方式&#xff0c;2a1&#xff0c;2a2&#xff0c;2a3&#xff0c;占比为1&#xff1a;5&#xff1a;1. 3 3 …...

如何解决 Java 中的 IllegalArgumentException 异常?

非法参数异常&#xff08;IllegalArgumentException&#xff09;的抛出是为了表明一个方法被传递了一个非法参数。该异常扩展了 RuntimeException 类&#xff0c;因此属于在 Java 虚拟机&#xff08;JVM&#xff09;运行期间可能抛出的异常。它是一种未检查异常&#xff0c;因此…...

Vue 双向数据绑定

之前通过v-bind来完成的数据绑定&#xff0c;属性值和表达式进行绑定&#xff0c;表达式的值发生变化了属性值也跟着发生变化。 单向数据绑定&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>首页</titl…...

电脑开机过程中,程序的启动的顺序是怎么样的?

电脑的启动过程涉及多个步骤,程序按照特定的顺序启动。这个过程通常如下: 电源开启: 当你按下电源按钮时,电源供应器(PSU)开始向电脑的各个组件供电。 自检加电(POST): 这是电脑启动过程的第一步。在这个阶段,基本输入输出系统(BIOS)或统一可扩展固件接口(UEFI)执行…...

JSON详细教程

&#x1f60a;JSON详细教程 &#x1f6a9;JSON简介☃️JSON语法规则&#x1f50a;JSON和JavaScript对象的区别 ☃️JSON数据类型字符串&#x1f50a;数字&#x1f50a;布尔值&#x1f50a;数组&#x1f50a;对象&#x1f50a;Null ☃️JSON对象&#x1f50a;访问JSON对象的值&a…...

DSP介绍及CCS

文章目录 CCS版本编译器CCS使用注意严禁中文 CCS的基本操作新建工程导入现有工程调整字体的大小工程界面恢复标签的使用 仿真盒小虫子进入在线Debug 仿真器芯片TMS320F28355基本介绍特性 DSP中特殊指令dsp指令中的EALLOW EDIS CCS TI官网 版本 CCS版本&#xff1a; CCS8.3.1…...

周期串(Periodic Strings)

做了我两个小时&#xff0c;我真的裂开 之前已经发过一次了&#xff0c;走在回宿舍的路上突然发现有些情况并不适用&#xff0c;赶紧删掉了 题目如下&#xff1a; 如果一个字符串可以由某个长度为k的字符串重复多次得到&#xff0c;则称该串以k为周期。例如&#xff1a;abca…...

C语言——猜凶手

题目&#xff1a; 日本某地发生了一件谋杀案&#xff0c;警察通过排查确定杀人凶手必为4个嫌疑犯的一个。 以下为4个嫌疑犯的供词: A说&#xff1a;不是我。 B说&#xff1a;是C。 C说&#xff1a;是D。 D说&#xff1a;C在胡说 已知3个人说了真话&#xff0c;1个人说的是假话。…...

【TiDB】TiDB离线方式部署

目录 1 下载TiDB离线组件包 2 安装TiUP 3 合并离线包 4 TIDB 软件和硬件环境建议配置 5 TiDB环境与系统配置检查 6 生成集群初始化配置文件模板 7 执行部署命令 1 检查就能存在的潜在风险 2 手动修复风险 3 部署 TiDB 集群 8 查看TIUP管理的集群情况 9 检查部署的…...

android shape绘制半圆

<?xml version"1.0" encoding"utf-8"?><shape xmlns:android"http://schemas.android.com/apk/res/android"android:shape"rectangle"><sizeandroid:width"20dp"android:height"10dp" /><…...

【开源】基于Vue和SpringBoot的个人健康管理系统

项目编号&#xff1a; S 040 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S040&#xff0c;文末获取源码。} 项目编号&#xff1a;S040&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健…...

qt QString字符串常用转换

QString字符串转换类型,常见的有: 1. const char*初始化QString.即const char*类型转QString字符串类型. QString str("肖战");qDebug() <<str; 2. QChar数组初始化QString.即QChar字符数组转QString字符串. QChar cHello[5] {H,e,l,l,o};QString strHell…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...