[Linux入门篇]一篇博客解决C/C++/Linux System Call文件操作接口的使用

news2024/11/14 15:27:32

目录

0.前言

1.C / C++ ->文件操作

1.1 C语言文件操作

1.1.1 C语言文件打开/关闭/写入

1.1.2 C语言文件的追加操作

1.1.3 C语言文件的读取

1.2 C++语言文件操作

1.2.1 C++文件打开 / 关闭 / 写入

1.2.2 C++文件读取

1.2.3 文件追加

2.三个默认输入输出流

2.1 C语言中的三个

2.2从三个流的操作引入一切皆文件

2.2.1主体操作

2.2.2标准输出和标准错误的小区别

2.2.3从文件操作体会一切皆文件

2.3从流文件操作看OS对底层的封装

3.系统调用接口(文件操作)

3.1 open接口

3.1.1 open参数与返回值

3.1.2 open的实践使用

3.2 write接口

3.3 read接口

3.4 write追加


0.前言

本文所有代码都以上传至gitee:
practice14 · onlookerzy123456qwq/Linuxtwo - 码云 - 开源中国 (gitee.com)

1.C / C++ ->文件操作

我们首先来复习一下,C语言,C++的对于文件操作提供的接口。

1.1 C语言文件操作

1.1.1 C语言文件打开/关闭/写入

//FILE *fopen(const char *path, const char *mode);      
  FILE* f_test = fopen("./diary.txt","w");      
  //打开文件需要检查是否打开成功      
  if(f_test == NULL)       
  {                        
    printf("file open error\n");      
    return 1;             
  }                        
  //对文件进行写入操作(写入5个hello world\n)     
  int k = 5;               
  while(k--){      
  //int fputs(const char *s, FILE *stream);        
  fputs("hello world\n",f_test);    
  }                        
  //打开文件需要关闭文件  
  //int fclose(FILE *fp);                                                                                        
  fclose(f_test);                                                                                                 
  return 0;   
首先我们如何在C语言当中 打开文件,使用的是 fopen接口, 返回的是一个 FILE*指针,我们拿到这个FILE* 指针,就可以 通过FILE指针对打开的相应文件操作
fopen的第一个参数是 path,指明这个 文件所在的路径+文件名,我们例子中的 "./diary.txt",指明的就是 当前文件夹下的diary.txt文件进行打开
fopen的第二个参数是 mode,我们要填入的是 打开这个文件的模式,例如你是以 只读方式,或写方式,或追加方式等,对文件进行打开。
PS:我们打开文件之后,需要记住两件事, 第一件事是检查文件打开是否成功,如果 fopen失败返回的是 NULL。第二件事是 fclose关闭文件,不然会对后续文件的操作产生影响: 此处如果没有fclose,数据留在缓冲区中,虽然可以成功写入,但是无法成功读取。
然后我们讲C语言的 写入文件接口 fputs,它的 第一个参数s是要写入文件的字符串,写入到的目标文件是 第二个参数FILE* stream,也就是 fopen的返回值,指代 要写入的文件是谁

1.1.2 C语言文件的追加操作

这里我们要注意需要以 追加append的方式打开这个文件,即 fopen的第二个参数我们传入"a",然后我们调用C语言写入接口,就会默认在文件尾进行写入,完成对原来内容的追加。
 //FILE *fopen(const char *path, const char *mode);          
  FILE* f_test = fopen("./diary.txt","a");          
  //打开文件需要检查是否打开成功          
  if(f_test == NULL)           
  {                            
    printf("file open error\n");          
    return 1;       
  }                                      
  //对文件append操作                   
  int k = 5;                                                  
  while(k--){                                 
  fputs("hello world\n",f_test);          
  }                                      
  //打开文件需要关闭文件                                                                                              
  fclose(f_test);

1.1.3 C语言文件的读取

这里读取我们使用的是 fgets接口:
fgets接口是 一次读取文件的一行内容到buffer接收缓冲区里面,第一个参数填buffer接口缓冲区,即把从文件中 读取到的一行内容放在哪里
第三个参数是FILE* stream,表征的是 从哪个文件里面进行一行的读取
第二个参数int size,它的意义是 期待最多读取size-1个字符最多读取size-1个字符,也可以读取不到这么多,所以 只需要你填入buffer的size大小即可。fgets接口会在 读取到的字符串的最后,自动添加\0
//FILE *fopen(const char *path, const char *mode);              
  FILE* f_test = fopen("./diary.txt","r");    
  //打开文件需要检查是否打开成功              
  if(f_test == NULL)    
  {                                
    printf("file open error\n");              
    return 1;           
  }                                          
  //对文件read操作 
  //create buffer to receive the data of the file we read
  char buffer[256];
  memset(buffer,0,sizeof(buffer));
  printf("We read file:\n");
  //char *fgets(char *s, int size, FILE *stream);
  //fgets从流上读取最多(size-1)个字符并将其存储到s指向的buffer中,当遇到新的一行或文件结束标志时结束
  while(fgets(buffer,sizeof(buffer),f_test) != NULL){
    //每次都读取一行到buffer里面,所以说每次读取一行,我们就要对这个打印这一行,否则就会一行一行覆盖前面读取的内容
    printf("%s\n",buffer);
  }
  //读取完毕文件之后需要检查是否读取完成成功
  if(!feof(f_test)){
    printf("file read not to end,file quit illegally!\n");
  }
  //打开文件需要关闭文件                                                                                                  
  fclose(f_test);     
每次读取的是一行的内容到缓冲区当中,所以说 每次读取一行,我们就要对这个打印这一行,否则就会被 下一次fgets读取的下一行的内容 覆盖buffer中前面读取的内容
然后还要记得对读取之后进行检查,因为存在读取失败的问题,feof接口, 检查此时文件是否已经到文件尾,即我们是否已经读取完毕。

1.2 C++语言文件操作

1.2.1 C++文件打开 / 关闭 / 写入

  //explicit ofstream (const char* filename, ios_base::openmode mode = ios_base::out);
  std::ofstream ofs("./diary2.txt",std::ios::out | std::ios::binary);
  //打开文件就要检查是否打开成功
  if(!ofs.is_open()){
    cout<<"file open error"<<endl;
    return 1;
  }
  //对文件进行写入
  string name = "张三";
  int age = 18;
  ofs << "姓名:"<<name<<" "<<"年龄:"<<age<<endl;
  //还可以调用ofs的write接口进行写入
  string message_temp = "Happy Everyday!~\n";
  for(int i = 0;i<3;++i)
  {
    ofs.write(message_temp.c_str(),message_temp.size());
  }
  //即使我们不主动close,也会在析构的过程中自动关闭,但是我们提倡主动释放,减少资源占据
  ofs.close();
  return 0;
C++使用的ofstream类的对象,进行对目标文件的打开, ofstream构造函数第一个参数要打开的文件路径+文件名,第二个参数是 打开的方式是什么,比如默认缺省不写是 文本写入,我们上述代码块的第二行是 二进制写入的方式打开文件
打开文件之后我们有两件事,第一件事是 查看文件是否被打开成功,我们 调用的是ofstream对象的is_open()成员函数;第二件事是 关闭文件,调用的是 ofstream对象的close()成员函数。当然C++当中有析构函数,可以不用主动close,ofs对象生命周期结束的时候,可以自动调用close,但是能主动调就主动调,减少资源的占据。

1.2.2 C++文件读取

C++文件读取,我们使用的是ifstream类对象,构造函数第一个参数是要进行读取文件的路径+文件名,第二个参数是传入的打开文件的模式,默认是文本读取,下面代码我们设置的是二进制读取模式。
ifstream读取文件内容的方式可以调用对于int string类等自己封装的的operator>>函数,也可以调用ifstream类的成员方法read。
 //explicit ifstream (const char* filename, ios_base::openmode mode = ios_base::in);
  std::ifstream ifs("./diary2.txt",ios_base::in | ios_base::binary);
  //打开文件就要检查是否打开成功
  if(!ifs.is_open()){
    cout<<"file open error"<<endl;
    return 1;
  }
  //对文件进行读取
  string name;
  int age = 0;
  ifs >> name >> age;
  //打印读取到的信息
  cout<<"We Read:\n姓名:"<<name<<" "<<"年龄:"<<age<<endl;
  //还可以使用read语法
  char buffer[128];
  //读取到的内容放到buffer当中,期待读取的字节数是sizeof(buffer)
  ifs.read((char*)buffer,sizeof(buffer));
  cout<<"We Also Read:\n"<<buffer<<endl;
  //即使我们不主动close,也会在析构的过程中自动关闭,但是我们提倡主动释放,减少资源占据
  ifs.close();

如图看到我们的读取文件代码是成功的。

1.2.3 文件追加

C++的追加写入,我们只要在写入ofstream类构造函数基础上,设置app追加模式,然后进行对ofs的写入即可。
//explicit ofstream (const char* filename, ios_base::openmode mode = ios_base::out);
  std::ofstream ofs("./diary2.txt",std::ios::app | std::ios::binary);
  //打开文件就要检查是否打开成功
  if(!ofs.is_open()){
    cout<<"file open error"<<endl;
    return 1;
  }
  //对文件进行追加写入
  string name = "李四";
  int age = 19;
  ofs << name <<" "<<age<<endl;
  //还可以调用ofs的write接口进行写入
  string message_temp = "Not Bad Everyday!~\n";
  for(int i = 0;i<3;++i)
  {
    ofs.write(message_temp.c_str(),message_temp.size());
  }                                                                                                                                         
  //即使我们不主动close,也会在析构的过程中自动关闭,但是我们提倡主动释放,减少资源占据
  ofs.close();

2.三个默认输入输出流

2.1 C语言中的三个

C程序,在加载到内存,成为一个进程的时候面,会默认打开三个输入输出流stdin,stdout,stderr。他们都是FILE*类型。这个FILE的本质是 C语言提供的,一个 结构体,可以通过这个结构体找到这个文件。
站在体系结构的角度理解, stdin对应的设备是键盘,stdout对应的硬件设备是显示器,stderr对应的硬件设备是显示器。它们的学名分别叫做 标准输入,标准输出,标准错误
同时C++当中,也会默认有三个对象: cout,cin,cerr,也分别对应 标准输入,标准输出,标准错误,也分别对应键盘,显示器,显示器。

2.2从三个流的操作引入一切皆文件

2.2.1主体操作

刚刚我们接触的C语言的三个默认打开的文件流,stdin,stdout,stderr,都是FILE*类型,其实都是可以当做打开的文件FILE* f_stream直接去操作的。
//C语言会默认打开三个文件流stdin stdout stderr
  6   //我们可以直接使用这三个FILE* 文件流 
  7   const char* w_str = "hello fprintf stdout\n";
  8   fprintf(stdout,w_str,strlen(w_str));

我们看到fprintf stdout,就是往stdout这个文件,也就是显示器进行写入。效果是等同于这个printf的。
char buffer[128];  
memset(buffer,0,sizeof(buffer));
fscanf(stdin,"%s",buffer);
printf("We Read From stdin:\n%s\n",buffer);

我们看到fsacnf stdin,就是往stdin这个文件,也就是键盘进行写入。效果是等同于scanf的。
const char* w_str = "hello fprintf stderr\n";                    
fprintf(stderr,w_str,strlen(w_str));

我们看到fprintf stderr,就是往stderr这个文件,也就是显示器进行写入。

2.2.2标准输出和标准错误的小区别

我们 往stdout和stderr写入,本质都是往对应的显示器写入,他们对应的设备是一样的,使用写入接口如fprintf对这两个标准输出,标准输出,本质都是在显示器写入,那有什么小文件写入呢?
区别就在于 输出重定向的时候,只有我们往 标准输出sdtout写入的内容,才会被重定向,写入到目标文件当中,而向stderr标准错误写入的的内容是不会被重定向的,仍然被写入打印到了屏幕当中。
下面我们演示重定向操作:

2.2.3从文件操作体会一切皆文件

可是你是否有想过,这个 stdout,stdin,stderr,都是FILE*类型,也可以 被当做文件使用,可是他们 本质代表的是显示器,键盘这些硬件啊!难道这些 硬件都是一种文件file吗?
事实上, 在LinuxOS看来,这些都是文件!刚刚我们做的实验 fputs向 一般文件 或者 硬件设备 都能进行写入一般文件,都存储在磁盘上,所以其实这些 文件的本质也是硬件,也可以证明 硬件设备也是一种FILE。
在LinuxOS看来, 所有的 存储在磁盘上的 file,这些是我们通常认识的一般文件,事实上,我们可以继续扩展,所有的硬件也是文件!
======》得出一个结论: Linux下一切皆文件!!!

2.3从流文件操作看OS对底层的封装

OS是软件和硬件的管理者,任何外部势力要访问,都要经由OS。 所有的文件file,都是储存在磁盘当中的,或者说是磁盘的一部分,所以他们是硬件,所以我们刚刚的 写入/读取文件(硬件)的操作都是经由OS之手的。
OS不相信任何人,任何用户想要访问 只能通过OS对上提供的系统调用接口System Call,进行合法的访问。所以,我们 对文件(软件 / 硬件)写入,本质都是 通过System Call 即系统调用接口访问到的!

所以,我们可以大胆的得出一个结论:
几乎所有的语言,fopen fclose fread fwrite fgetsfputs fgetc fputc , 等这些对文件(硬件)进行读写接口的实现,这个过程一定是 经由了System Call层故这些上层语言的接口一定使用OS提供的系统调用接口封装实现的!
我们接下来演示系统调用接口,当然这里演示的是文件的系统调用接口,因为这个离着OS更近,我们可以用语言(OS System Call层)进行讲解。
万变不离其宗,所有语言的文件调用接口,都是对(文件操作的)System Call系统调用接口的封装。
我们把底层学好了,上层怎么学都可以,上面我们是从OS对软件硬件的管理的角度理解的系统调用与上层语言之间的关系。

3.系统调用接口(文件操作)

3.1 open接口

3.1.1 open参数与返回值

open接口是Linux中的 系统调用接口,负责对文件的打开,第一个参数 pathname,传入的是 想要打开文件的路径+文件名;第二个参数 int flags是打开文件的标志,即我们是以什么方式打开这个文件( 只读,只写,还是追加);第三个参数是 mode_t mode,这个是打开 文件的权限设置
open的返回值是int,这个 int其实就是文件描述符fd(file descriptor)。如果打开文件失败返回-1,并设置全局错误码。
pathname好理解,就是 路径+文件名int flags也可以直接 类比C语言fopen接口的打开方式"w","r",“a”,但是这里传入的实际上 是一个int,但是我们 不直接传入int,而是通过 系统文件给我们提供的宏(如下图)进行传入。

int fd = open("./diary3.txt",O_WRONLY | O_CREAT,xxxxx);
举个上面代码片的例子, 第一个参数指定打开的路径+文件名,第二个参数是两个宏的或运算,这个就是我们传入的int。
从感性的角度理解, O_WRONLY是以只写方式打开这个文件,O_CREAT是创建这个文件,所以我们是以如果这个文件不存在我们就创建,然后以只写的方式打开。这个 O_WRONLY | O_CREAT其实就可以直接类比为C语言fopen的"w"打开方式!
从理性的角度理解,这两个宏可以进行或运算,成为一个int,说明 这些宏本身就是一个数,然后 这些宏或运算起来可以表征某种信息,open接口接收到这个整形信息,就知道你要以什么方式打开这个文件。现在有 6个bit位,比如第一个bit位代表米饭,第二个bit位代表馒头,第三个bit位代表牛肉,第四个bit位代表羊肉,第五个bit位代表可乐,第六个bit位代表雪碧,我传入的是 011001,然后open接口就知道你要吃的是 馒头+牛肉+雪碧
这里的 每一个宏其实就代表了某一个特定bit位的数,在 open当中就看int的32个bit位的有无情况来设定你是在以什么方式在打开这个文件,如第一个bit标志位, 看看你是想创建这个文件 , 第二个bit位的有代表你是想写入这文件。所以此时O_WRONLY是0b1,O_CREAT是0b10,O_WRONLY | O_CREAT就是0b0000 0011。
本质上 这些宏就是在代表不同的bit位。而且不同的宏代表不同的bit位。
我们的理解是这样的,我们紧接着看一下系统文件是怎么样的:

通过grep指令,我们看到 #define的这些宏,就是bit位样式的定义!这验证了我们的想法。
理解完第二个参数,我们理解 第三个参数,mode_t mode:任何一个文件,都有一个重要的属性,即 文件权限,尤其是你没有文件的时候,你创建一个文件,肯定要 设置这个文件的权限,所以这个mode其实就是传入对于 owner,group,other的权限设置。我们采用 八进制方案传入0644,本质就是rw-r--r--。
int fd = open("./diary3.txt",O_WRONLY | O_CREAT,0644);
不是你的生活充满阳光,总有人替你负重前行!!!(C语言封装都替你搞好了mode权限管理)同时根据我们之前的理论, C语言上的打开文件接口fopen都是封装的系统调用open,这个mode参数fopen都已经帮我们搞好了!
你在C语言的接口对 文件的权限(mode)都是漠不关心的,因为这些概念都是 和OS强相关的。C语言给你做封装, 你也就不用再关心权限这些细节了
open系统调用接口的返回值int,是文件描述符,可以类比fopen的返回值FILE* fp,这个其实就是我们后续对特定文件进行写入读取的索引(如何知道 你是在对哪个文件进行写入,C语言用的是fopen打开文件的 返回值FILE* fp,系统调用这里用的是open打开文件的 返回值int fd)。

3.1.2 open的实践使用

我们open一个文件之后,不管怎么样, 一定要记得关闭一个这个文件,我们配套的系统调用关闭文件的接口是close(int fd)。

所以完整的打开一个文件的过程:
 //int open(const char *pathname, int flags, mode_t mode);
 //int fd = open("./diary3.txt",O_WRONLY | O_CREAT);
 //这里的O_WRONLY,O_CREAT的本质都是代表一个bit为1的整形值,通过或出的值的方式,设计相应标志位
 //open接口就知道你是以什么方式打开的了
 //这里O_WRONLY代表写的方式打开接口,O_CREAT代表创建这个文件,这两个的组合就是C中的“w的意义
 //0644代表设置对于打开这个文件的权限管理模式设置(采用八进制表示法)
 int fd = open("./diary3.txt",O_WRONLY | O_CREAT,0644);
 //检查是否打开成功(依托的是返回值)
 if(fd<0){
   printf("file open error\n");
   return 1;
 }
 
 //关闭文件
 close(1);\

3.2 write接口

系统调用write,它的作用就是 对特定文件进行写入操作int fd表征你在具体往哪个文件写,buf表示的是你要写入的内容缓冲区,size_t count是你期待写入的字节数。返回值ssize_t是你实际向文件写入的字节数目,如果写入失败返回-1。(你想写入的字节数,不一定都写入,万一你的传的count过大了,那写入的数目就是错的,真正的写入的字节数还是看write的返回值)

直接结合open上写入文件的操作:
  //1.打开/创建文件
  int fd = open("./diary3.txt",O_CREAT | O_WRONLY);
  //检查是否打开成功
  if(fd<0){
    perror("open");
    return 1;
  }
  //2.对文件进行写入
  char buffer[128] = "Never ever ever ever give up\n";
  //系统调用接口write:
  //第三个参数是你期待写入的字节数,返回值是实际上写入成功的字节数
  //我们写入字符串不写入\0,因为这是仅仅只是C语言层面对字符串的标记而已
  ssize_t w_size = write(fd,buffer,strlen(buffer));
  //检查写入
  if(w_size<0){
    perror("write");
    return 2;
  }
  printf("We Write File Success:%s",buffer);
  //关闭文件
  close(fd);

3.3 read接口

系统调用read,它的作用就是 对特定文件进行读取操作int fd表征你在具体往哪个文件读,buf表示的是你要接收读取内容的缓冲区,size_t count是你期待读取的字节数量。返回值ssize_t是你实际向文件读取到的字节数目,如果读取失败返回-1。(你想读取到的字节数,不一定能读取这么多,万一你的传的count过大了,那实际读取的数目就是错的,真正的读取到的字节数还是看read的返回值)

write要注意的是不要写入字符串最后的\0这个字节read要注意的是,你在读取的时候,要 注意给buffer预留一个字节,自己主动填写\0,所以我们 期待读取的count字节数,不要写成sizeof(buffer),而是要写sizeof(buffer)-1。
  //1.打开/创建文件
  int fd = open("./diary3.txt",O_RDONLY);
  //检查是否打开成功
  if(fd<0){                                           
    perror("open");   
    return 1;                                                    
  }                                                                  
  //2.对文件进行读取                                             
  char buffer[128] ;
  memset(buffer,0,sizeof(buffer));
  //系统调用接口read:
  //第三个参数是你期待读到的字节数,返回值是实际上读取成功的字节数
  ssize_t r_size = read(fd,buffer,sizeof(buffer)-1);
  //检查写入 
  if(r_size<0){
    perror("read");                        
    return 2;                                                                                                              
  }         
  //[0,r_size-1]是读取到的字节数据
  buffer[r_size] = '\0';
  printf("We Read File Success:%s\n",buffer);
  //关闭文件
  close(fd);

3.4 write追加

//1.打开/创建文件
  //ERROR:int fd = open("./diary3.txt",O_APPEND); 要追加首先要有WR写权限
  int fd = open("./diary3.txt",O_WRONLY | O_APPEND);
我们只要在打开open这个文件的时候,在O_WRONLY的基础上,再或上一个O_APPEND标志即可。然后就用相应的write写入系统调用,就是在文件尾进行写入,即追加。

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

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

相关文章

#gStore-weekly | gBuilder功能详解之项目管理

1. gBuilder介绍 我们知道知识图谱整个生命周期分为构建、存储管理与应用三个阶段。其中我们之前介绍的图数据库gStore对应解决的是知识图谱的存储与管理这个阶段问题。实际上知识图谱项目中大部分时间都花在知识图谱构建阶段&#xff0c;虽然知识图谱构建不直接体现价值&…

Hermite插值及其Julia实现

文章目录基本原理算法实现无论是Newton插值还是Lagrange插值&#xff0c;都只能在数值本身上满足插值函数与数据节点的重合&#xff0c;Hermite插值则要求其导数值相等。 基本原理 设在节点a⩽x0⩽x1⩽…⩽xn⩽ba\leqslant x_0\leqslant x_1 \leqslant\ldots\leqslant x_n\le…

ESP32使用TCP HTTP访问API接口JSON解析获取数据

ESP32使用TCP HTTP访问API接口JSON解析获取数据API接口代码解析获取时间代码烧录效果总结API接口 单片机常用的API接口基本都是返回的一串JSON格式的数据&#xff0c;这里以ESP32联网获取时间信息作为获取API数据的示例&#xff0c;以便后续移植使用。 很多功能性的API接…

UML-活动图以及PlantUML绘制

介绍 活动图&#xff08;英语&#xff1a;activity diagram&#xff09;是工作流的图形化表示。活动图主要由活动和动作构成&#xff0c;也可以支持分支选择、迭代、并行。在 UML 中&#xff0c;活动图主要用于为计算性和组织性过程&#xff08;即工作流&#xff09;建模&…

PaddlePaddle本地环境安装(windows11系统)

写在前面: 这里是关于win11安装PaddlePaddle的步骤和方法,建议参考官方的方法。截止2023年3月份,PaddlePaddle的版本是2.4.2。 官方参考:飞桨PaddlePaddle快速安装使用方法 建议使用Anaconda安装 ,关于Anaconda创建环境的可以借鉴:深度学习Anaconda环境搭建(比较全面)…

Exposure X7胶片滤镜调色插件免费版下载

ps是我们为图片进行调色的一种必要手法&#xff0c;我们可以通过添加滤镜、使用曲线、调整色相、饱和度等ps手法来对图片加以修饰。下面这篇文章就来为大家介绍一下ps调色方法主要有&#xff0c;ps调色插件怎么用的相关知识。 Exposure X7是一款特别好用的胶片滤镜模拟软件&am…

ESP32设备驱动-MicroSD Card驱动

MicroSD Card驱动 1、SDCard介绍 SD卡是Secure Digital Card卡的简称,直译成汉语就是“安全数字卡”,是由日本松下公司、东芝公司和美国SANDISK公司共同开发研制的全新的存储卡产品。SD存储卡是一个完全开放的标准(系统),多用于MP3、数码摄像机、数码相机、电子图书、AV器…

代码看不懂?ChatGPT 帮你解释,详细到爆!

偷个懒&#xff0c;用ChatGPT 帮我写段生物信息代码如果 ChatGPT 给出的的代码不太完善&#xff0c;如何请他一步步改好&#xff1f;网上看到一段代码&#xff0c;不知道是什么含义&#xff1f;输入 ChatGPT 帮我们解释下。生信宝典 1: 下面是一段 Linux 代码&#xff0c;请帮…

开学季平价好用电容笔有哪些?ipadpro触控笔推荐

众所周知&#xff0c;苹果原装的Pencil的售价由于比较高&#xff0c;所以很多用户都无法入手。那么&#xff0c;市场上会不会有一款价格上只有苹果Pencil五分之一左右、但功能几乎相同的电容笔&#xff1f;事实上&#xff0c;确实存在。国内的平替电容笔&#xff0c;不管是压感…

二点回调测买 源码

如图所示&#xff0c;两点回调测买点的效果图&#xff0c;这是我们常见的一种预测买点计算方法。 现将源码公布如下&#xff1a; DRAWKLINE(H,O,L,C); N:13; A1:REF(HIGH,N)HHV(HIGH,2*N1); B1:FILTER(A1,N); C1:BACKSET(B1,N1); D1:FILTER(C1,N); A2:REF(LOW,N)LLV(LOW,2*N1…

正交采样

文章目录【 1、欧拉公式的频谱 】【 2、模拟正交采样 】【 3、数字正交采样 】【 1、欧拉公式的频谱 】 对于余弦信号 cos(2πf0t)12ej2πf0t12e−j2πf0tcos(2\pi f_0 t)\frac{1}{2}e^{j2\pi f_0 t}\frac{1}{2}e^{-j2\pi f_0 t}cos(2πf0​t)21​ej2πf0​t21​e−j2πf0​t&a…

Shell基础 (一)

目录 一、关于shell 1、什么是shell&#xff1f; 2、shell入门 二、shell进阶&#xff08;重点&#xff09; 1、变量 2、条件判读语句 3、运算符 一、关于shell 1、什么是shell&#xff1f; Shell&#xff08;外壳&#xff09;是一个用C语言编写的程序&#xff0c;它是用…

《程序员面试金典(第6版)》面试题 02.08. 环路检测

题目描述 给定一个链表&#xff0c;如果它是有环链表&#xff0c;实现一个算法返回环路的开头节点。若环不存在&#xff0c;请返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xf…

如果想了解营销的最高境界,请看如何开创新品类?

如果想了解营销的最高境界&#xff0c;请看 如何开创新品类&#xff1f; 中国奶粉第一品牌飞鹤奶粉&#xff5e; 品牌策划人王博总结的方法 趣讲大白话&#xff1a;看看高手怎么想 【安志强趣讲信息科技95期】 ******************************* 不懂品牌营销的程序员不是好厨师…

第一次使用Python for Qt中的问题

在创建带有form的python for qt的时候&#xff0c;使用的库是pySide6&#xff0c;而不是pyqt。 因此&#xff0c;需要安装pyside6。 Running "/usr/bin/python3 -m pip install PySide6 --user" to install PySide6. ERROR: Could not find a version that satisfi…

hivesql实现不同的求和需求【分组求和、帕累托累计求和、滑动求和】

hivesql求和&#xff0c;分组求和&#xff0c;帕累托累计求和&#xff0c;滑动求和 实现功能如下示例&#xff1a; 列s1&#xff1a;分组求和&#xff0c;这里以sku_id分组求和&#xff0c;E5单元格对应sku_ida01时的C列求和&#xff1b; 列s2&#xff1a;帕累托求和&#x…

X264简介-Android使用(一)

X264 简介及使用 1、简介 2、环境搭建 3、使用 4、小结 简介 官网连接&#xff1a;https://www.videolan.org/developers/x264.html 官方文档&#xff1a;https://wiki.videolan.org/Category:X264/ x264是用于编码H.264/MPEG-4 AVC视频流的免费软件库。它世界上最流行的…

每天一个linux命令:性能监控和优化命令之top

top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。下面详细介绍它的使用方法。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止…

将fluentMeshing网格转换为openFoam网格

简介 fluentMeshing是一个绘制源生多面体网格的强大工具&#xff0c;其生成的网格可以进一步导出&#xff0c;转换为OpenFoam格式&#xff0c;供OpenFoam计算。 本文将介绍如何把fluentMeshing网格转换为openFoam网格&#xff0c;以及其注意事项 步骤 &#xff08;1&#x…

【QML】锚布局

文章目录1、锚&#xff08;Anchors&#xff09;2、一些示例Qt Quick中有两套与布局管理相关的类库&#xff0c;一种是Item Positioner&#xff08;定位器&#xff09;&#xff0c;一种是Item Layout&#xff08;布局&#xff09; 定位器&#xff1a;Row&#xff08;行定位器&am…