【转载自amobbs IDzhcj66】FATFS读取数据问题

2023-12-24 23:38

本文主要是介绍【转载自amobbs IDzhcj66】FATFS读取数据问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

f_mount(0, &fs); //将文件系统设置到0区

if (f_opendir(&dirs, (const TCHAR*)”0:/Song”) == FR_OK) //读取该磁盘的根目录
{

while (f_readdir(&dirs, &finfo) == FR_OK)           //循环依次读取文件名
{        if(!finfo.fname[0])         break;                         //如果是文件名为空表示到目录的末尾。退出         USART_OUT(USART1,"\r\n文件名是:\n   %s\n",finfo.lfname);                 //输出文件名---这里读出文件名是正常的fn = finfo.lfname;         strcpy(ShuZu1,"0:/MUSIC/");                                //复制路径(目录)strcat(ShuZu1,(const char*)fn);                          //将文件名接在后面res = f_open(&fsrc, ShuZu1, FA_OPEN_EXISTING | FA_READ);        //长文件名                                while(1){res = f_read(&fsrc, buffer, sizeof(buffer), &br);//在这里无法读取数据 读出的res是9 说文件/目录对象是无效 原因?......if (res || br == 0) break;   // 是否到文件尾}}

}
问题是读取Song文件夹中的文件名是正确的,无法读取文件的数据,请问问题出在哪里


自己恢复一下,问题找到了
打开的文件是Song文件不是Music文件,都是移植别人的东西没有细心看造成的
void Play_Music(void)
{
FILINFO finfo;//文件结构
DIR dirs;//目录对象结构
unsigned int count=0;
char * ShuZu1;

f_mount(0, &fs); //将文件系统设置到0区
if (f_opendir(&dirs, (const TCHAR*)”0:/Song”) == FR_OK)
{
while (f_readdir(&dirs, &finfo) == FR_OK) //循环依次读取文件名
{

ShuZu1=mymalloc(SRAMIN,finfo.lfsize); //为带路径的文件名分配内存
strcpy(ShuZu1,”0:/Song/”); //复制路径(目录)
strcat(ShuZu1,(const char*)finfo.lfname); //将文件名接在后面

res = f_open(&fsrc, ShuZu1, FA_OPEN_EXISTING | FA_READ);

           br=1;                       for (;;) {        res = f_read(&fsrc, buffer, sizeof(buffer), &br);             ...   

if (res || br == 0) break; // 是否到文件尾
}

f_close(&fsrc);
}
}
}
if (f_opendir(&dirs, (const TCHAR*)”0:/Song”) == FR_OK)这里只有一个/一定要注意哦 还有不是\
strcpy(ShuZu1,”0:/Song/”);)这里只有两个/一定要注意哦 还有不是\


FATFS fs;                      // 逻辑驱动器的标志 
FIL fsrc, fdst;                // 文件标志  
unsigned char buffer[512];     // 文件内容缓冲区 
FRESULT res;                   // FatFs 功能函数返回结果变量 
unsigned int br, bw;           // 文件读/写计数器 
char str[100][100];            //存放文件名称 
void Play_Music(void) 
{  
FILINFO finfo; 
DIR dirs; 
unsigned int count=0; 
char path[50]={""},j=0; 
char *result1;  
char EXT1[4]=".mp3";  
unsigned short i; 
/*开启长文件名功能时, 要预先初始化文件名缓冲区的长度 */ 
#if _USE_LFN 
static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1]; 
finfo.lfname = lfn; 
finfo.lfsize = sizeof(lfn); 
#endif 
USART_OUT(USART1,"\n文件系统(Tini-FatFS0.08b)启动成功! \n"); disk_initialize(0);              //fatfs可以管理多个介质的分区, 所以把物理存储介质SST25VF016B标示为0区,相当于磁盘编号 
VS1003_start(); 
f_mount(0, &fs);              //将文件系统设置到0区  
if (f_opendir(&dirs, path) == FR_OK)            //读取该磁盘的根目录         
{ 
while (f_readdir(&dirs, &finfo) == FR_OK)           //循环依次读取文件名 
{          
if (finfo.fattrib & AM_ARC)               //判断文件属性是否为存档型         TXT文件一般都为存档型 
{ 
if(!finfo.fname[0])         break;                  //如果是文件名为空表示到目录的末尾。退出        
if(finfo.lfname[0])//长文件名 
{                           
USART_OUT(USART1,"\r\n文件名是:\n   %s\n",finfo.lfname);         //输出长文件名 
result1=strstr(finfo.lfname,EXT1);          //判断是否是mp3后缀的文件名 
} 
else//8.3格式文件名 
{                                                             
USART_OUT(USART1,"\r\n文件名是:\n   %s\n",finfo.fname);             //输出8.3格式文件名 
result1=strstr(finfo.fname,EXT1);          //判断是否是mp3后缀的文件名 
}        
if(result1!=NULL) 
{ 
if(finfo.lfname[0]) 
{                   //长文件名 //          strcpy(str[i],(const char *)finfo.lfname);          //将文件名暂存到数组里,以备LISTBOX调用          
//          i++;        
} 
else 
{                               //8.3格式文件名 //          strcpy(str[i],(const char *)finfo.fname);                      //将文件名暂存到数组里,以备LISTBOX调用 
//          i++; 
}                         //文件建立及增加内容。 
} 
}  
}  
}  
}  为什么添加上strcpy(str[i],(const char *)finfo.fname);这个函数读取就不正常了呢 求解

FATFS fs;                      // 逻辑驱动器的标志 
FIL fsrc, fdst;                // 文件标志  
unsigned char buffer[512];     // 文件内容缓冲区 
FRESULT res;                   // FatFs 功能函数返回结果变量 
unsigned int br, bw;           // 文件读/写计数器 
char str[100][100];            //存放文件名称 
void Play_Music(void) 
{  
FILINFO finfo; 
DIR dirs; 
unsigned int count=0; 
char path[50]={""},j=0; 
char *result1; 
char *ShuZu1; 
char EXT1[4]=".mp3";  
unsigned short i; 
//开启长文件名功能时, 要预先初始化文件名缓冲区的长度 
#if _USE_LFN 
static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1]; 
finfo.lfname = lfn; 
finfo.lfsize = sizeof(lfn); 
#endif 
USART_OUT(USART1,"\n文件系统(Tini-FatFS0.08b)启动成功! \n"); disk_initialize(0);              //fatfs可以管理多个介质的分区, 所以把物理存储介质SST25VF016B标示为0区,相当于磁盘编号 
VS1003_start(); 
f_mount(0, &fs);              //将文件系统设置到0区  
if (f_opendir(&dirs, path) == FR_OK)            //读取该磁盘的根目录         
{ 
while (f_readdir(&dirs, &finfo) == FR_OK)           //循环依次读取文件名 
{          
if (finfo.fattrib & AM_ARC)               //判断文件属性是否为存档型         TXT文件一般都为存档型 
{ 
if(!finfo.fname[0])         break;                  //如果是文件名为空表示到目录的末尾。退出        
if(finfo.lfname[0])//长文件名 
{                           
USART_OUT(USART1,"\r\n文件名是:\n   %s\n",finfo.lfname);         //输出长文件名 
result1=strstr(finfo.lfname,EXT1);          //判断是否是mp3后缀的文件名 
} 
else//8.3格式文件名 
{                                                             
USART_OUT(USART1,"\r\n文件名是:\n   %s\n",finfo.fname);             //输出8.3格式文件名 
//          result1=strstr(finfo.fname,EXT1);          //判断是否是mp3后缀的文件名 
}        
//          if(result1!=NULL) 
{ 
if(finfo.lfname[0]) 
{                   //长文件名 
ShuZu1=mymalloc(SRAMIN,finfo.lfsize); 
strcat(ShuZu1,(const char*)finfo.lfname); 
//          strcpy(str[i],(const char *)finfo.lfname);          //将文件名暂存到数组里,以备LISTBOX调用 
USART_OUT(USART1,"\r\n文件名是:\n   %s\n",ShuZu1); i++;        
} 
else 
{                               //8.3格式文件名 //          strcpy(str[i],(const char *)finfo.fname);                      //将文件名暂存到数组里,以备LISTBOX调用 
//          i++; 
}                         //文件建立及增加内容。 
} 
}  
}  
}  
} 
这样是正常的 请问为什么----------那么如何读取文件的大小呢
采用ff.h中的#define f_size(fp) ((fp)->fsize)----------如何在已有文件后面继续写数据呢?
1种方法是利用读写方法 这对于不大的文件可以
2种方法是先读出文件的大小,然后偏移到文件的最后,再进行写数据`----------/*-----------例程所用到的文件系统函数原型---------------------------------------在文件系统中注册/注销 工作区(0-9)-----------------------------------------------------------------
FRESULT f_mount (BYTE  Drive,                         //Logical drive number FATFS*  FileSystemObject          // Pointer to the work area 
);
参数:
Drive:用逻辑驱动器号(0-9) 去注册/注销 工作区 
FileSystemObject:文件系统工作区的标识。 
-----------------------------------------------------------------------------------------------打开目录------------------------------------------------------------------
FRESULT f_opendir (DIR* DirObject,               //空目录结构指针const TCHAR* DirName          //目录名指针
)
返回值:
FR_OK (0)  打开目录成功
--------------------------------------------------------------------------------
---------------读取目录下的文件名 --------------------------------------------------------
FRESULT f_readdir (DIR* DirObject,             // 目录结构指针FILINFO* FileInfo           // 文件信息指针 
);
返回值:
FR_OK (0)  读取文件名成功
-------------------------------------------------------------------------------------------
----------------为了存取数据,打开文件目标----------------------------------------------------------
FRESULT f_open (FIL* FileObject,                // 文件结构型指针 const TCHAR* FileName,          // 文件名指针BYTE ModeFlags             // 模式标志 
);
ModeFlags:
FA_OPEN_EXISTING: 指定为文件不存在的话,返回错误
FA_READ:          指定为文件读
FA_CREATE_ALWAYS: 文件不存在的话,直接建立
FA_WRITE:                    指定为文件写--------------------------------------------------------------------------
-----------------读文件数据--------------------------------------------------------------
FRESULT f_read (FIL* FileObject,    // 文件结构型指针 void* Buffer,       // 读数据缓冲区指针UINT ByteToRead,    // 要读取的字节数 UINT* ByteRead      // 返回的所读取的可变字节数的指针 
);
---------------------------------------------------------------------------------------------------写文件数据-------------------------------------------------------
FRESULT f_write (FIL* FileObject,     // 文件结构型指针 const void* Buffer,  // 写数据缓冲区指针UINT ByteToWrite,    // 要写入的字节数 UINT* ByteWritten    // 返回的所写入的可变字节数的指针 
);
----------------------------------------------------------------------------------
-----------------关闭打开的文件---------------------------------------------------
FRESULT f_close (FIL* FileObject     // 文件结构型指针 
);-------------------------------------------------------------------------------
*/``----------

/*
说明:
* 下面测试的是在根目录下建立一个RECORDER文件夹,然后在RECORDER文件夹下建立一个”测试.txt”文件,如果”测试.txt”文件存在就打开这个文件
* 在”测试.txt”文件下写入512个8
* f_lseek(&fdst,0);这里函数的意思是假设文件中有1000个数据,把指针移动到第一个位置上,500就是把指针移动到文件中的第500位置处
* 作者:Flame
* 测试时间:20130710
*/
/*
void OutPutFile(void)
{
unsigned int a;
FILINFO finfo;
DIR dirs;
//开启长文件名功能时, 要预先初始化文件名缓冲区的长度 //

if _USE_LFN

    static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1];finfo.lfname = lfn;finfo.lfsize = sizeof(lfn);

endif

    USART_OUT(USART1,"\nSTM32开发板文件系统(Tini-FatFS0.08b)启动成功! \n");disk_initialize(0);                                                     //fatfs可以管理多个介质的分区, 所以把物理存储介质SST25VF016B标示为0区,相当于磁盘编号f_mount(0, &fs);                                                             //将文件系统设置到0区 while(f_opendir(&dirs,"0:/RECORDER"))//打开录音文件夹{         USART_OUT(USART1,"\r\n打开RECORDER目录失败,正在建立RECORDER文件夹\n   %s\n",finfo.lfname);f_mkdir("0:/RECORDER");                                //创建该目录   } res = f_open(&fdst, "0:/RECORDER/测试.txt", FA_CREATE_ALWAYS | FA_WRITE);          //以写的方式打开文件,如果不存在,就直接建立,如果存在就覆盖掉br=512;for(a=0; a<512; a++) buffer[a]=0x38;                                                           //因为可以一次读出512字节,先清空数据缓冲区 f_lseek(&fdst,0);                                                        //偏移到文件头.res = f_write(&fdst, buffer, br, &bw);                                          //将缓冲区的内容写入到目标文件 也就是a2.txt//if (res || bw < br) break;   // error or disk full                  //如果写入时异常,或者磁盘满,退出 如果是循环写入可以调用这一句来判断写的状态f_close(&fdst);                                                                                                           //关闭源文件                         

}*/


/*
说明:
*    下面的函数是测试把跟目录中的txt文件读出,并把内容拷贝到在根目录下新建立的a2.txt中
*    下面测试的条件是TF卡中必须有一个.txt的文件,并且.txt文件里面有内容,.txt文件必须在跟目录下
*    通过调用f_read(&fsrc, buffer, sizeof(buffer), &br),然后读取br可以得到读取数据的大小
*    要注意的是f_close(&fsrc);和f_close(&fdst);千万不要搞混
*    作者:Flame
*    测试时间:20130710
*/
/*void OutPutFile(void)
{ 
unsigned int a;
FILINFO finfo;
DIR dirs;
char path[50]={""};                                                            //目录名为空,表示是根目录
//开启长文件名功能时, 要预先初始化文件名缓冲区的长度 
#if _USE_LFNstatic char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1];finfo.lfname = lfn;finfo.lfsize = sizeof(lfn);
#endifUSART_OUT(USART1,"\n稴TM32开发板文件系统(Tini-FatFS0.08b)启动成功! \n");disk_initialize(0);                                                     //fatfs可以管理多个介质的分区, 所以把物理存储介质SST25VF016B标示为0区,相当于磁盘编号f_mount(0, &fs);                                                             //将文件系统设置到0区 if (f_opendir(&dirs, path) == FR_OK)            //读取该磁盘的根目录        {while (f_readdir(&dirs, &finfo) == FR_OK)           //循环依次读取文件名{         if (finfo.fattrib & AM_ARC)                              //判断文件属性是否为存档型         TXT文件一般都为存档型{if(!finfo.fname[0])         break;                         //如果是文件名为空表示到目录的末尾。退出         if(finfo.lfname[0]){USART_OUT(USART1,"\r\n文件名是:\n   %s\n",finfo.lfname);}             //输出长文件名else{USART_OUT(USART1,"\r\n文件名是:\n   %s\n",finfo.fname);}                 //输出8.3格式文件名                //if(result1!=NULL||result2!=NULL)//是的话就输出文件的内容 {                                                                           if(finfo.lfname[0]){res = f_open(&fsrc, finfo.lfname, FA_OPEN_EXISTING | FA_READ);}//以读的方式打开文件else{res = f_open(&fsrc, finfo.fname, FA_OPEN_EXISTING | FA_READ); }//8.3格式文件名 以读的方式打开文件res1 = f_open(&fdst, "a2.txt", FA_CREATE_ALWAYS | FA_WRITE);          //以写的方式打开文件,如果不存在,就直接建立,如果存在就覆盖掉br=1;for (;;) {                                                                                                                  //循环读出被打开文件的扇区for(a=0; a<512; a++) buffer[a]=0;                                                           //因为可以一次读出512字节,先清空数据缓冲区 res = f_read(&fsrc, buffer, sizeof(buffer), &br);                          //将文件内容读出到数据缓冲区  br存储此次读出数据的数量,最大512USART_OUT(USART1,"%s\n",buffer);                                                          //将缓冲区的内容输出到串口1if (res || br == 0) break;   // error or eof                                  //判断是否到文件结束res1 = f_write(&fdst, buffer, br, &bw);                                          //将缓冲区的内容写入到目标文件 也就是a2.txt  br是在读的时候设置了写入的大小,通过查看br可以确定写入数据的多少if (res1 || bw < br) break;   // error or disk full                  //如果写入时异常,或者磁盘满,退出}f_close(&fsrc);                                                                                                           //关闭源文件//res1 = f_write(&fdst, buffer, br, &bw);在这里可以添加f_write,以便添加其他数据}                                                                                                   f_close(&fdst);//关闭目标文件 本条函数即时保存写入的数据,又是关闭目标文件,如有很多数据要写入,但不需要现在关闭可以调用f_sync函数,但是调用 f_sync前必蠪S_READONLY == 0可用}} } 
}*/----------
如何在已有文件后面继续写数据呢?
1种方法是利用读写方法 这对于不大的文件可以
2种方法是先读出文件的大 ...第二种操作步骤如下
1.f_mount(0, &fs);                                                             //将文件系统设置到0区 
2.f_opendir(&dirs, path)            //读取该磁盘的根目录
3.f_readdir(&dirs, &finfo)           //循环依次读取文件名
4.if(finfo.lfname[0]){res = f_open(&fsrc, finfo.lfname, FA_OPEN_EXISTING | FA_READ);}//以读的方式打开文件else{res = f_open(&fsrc, finfo.fname, FA_OPEN_EXISTING | FA_READ); }//8.3格式文件名 以读的方式打开文件
5.numSize1 = f_size(&fsrc); //读取文件大小
6.偏移到文件内容的尾部以上说的有不对的地方希望高人多多指点,这样愚人自己总结的

“/*
说明:
* 下面的函数是测试在已有的”大海.txt”文件下继续添加数据
* 测试条件在TF卡中建立”大海.txt”文件,并在文件中添加内容,测试过程中可以分别添加<512数据,=512数据,>512数据进行分别测试
* 作者:Flame
* 测试时间:20130711
*/
unsigned int FATFSNumSize;//文件大小存储变量,为了查看方便放到函数外部
void OutPutFile(void)
{
unsigned int a;
FILINFO finfo;
DIR dirs;
char path[50]={“”}; //目录名为空,表示是根目录
//开启长文件名功能时, 要预先初始化文件名缓冲区的长度

if _USE_LFN

    static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1];finfo.lfname = lfn;finfo.lfsize = sizeof(lfn);

endif

    USART_OUT(USART1,"\nSTM32开发板文件系统(Tini-FatFS0.08b)启动成功! \n");disk_initialize(0);                                                     //fatfs可以管理多个介质的分区, 所以把物理存储介质SST25VF016B标示为0区,相当于磁盘编号f_mount(0, &fs);                                                             //将文件系统设置到0区 if (f_opendir(&dirs, path) == FR_OK)            //读取该磁盘的根目录        {while (f_readdir(&dirs, &finfo) == FR_OK)           //循环依次读取文件名{         if (finfo.fattrib & AM_ARC)                              //判断文件属性是否为存档型         TXT文件一般都为存档型{if(!finfo.fname[0])         break;                         //如果是文件名为空表示到目录的末尾。退出         if(finfo.lfname[0]){USART_OUT(USART1,"\r\n文件名是:\n   %s\n",finfo.lfname);}             //输出长文件名else{USART_OUT(USART1,"\r\n文件名是:\n   %s\n",finfo.fname);}                 //输出8.3格式文件名                if(finfo.lfname[0]){res = f_open(&fsrc, finfo.lfname, FA_OPEN_EXISTING | FA_READ);}//以读的方式打开文件else{res = f_open(&fsrc, finfo.fname, FA_OPEN_EXISTING | FA_READ); }                           //8.3格式文件名 以读的方式打开文件FATFSNumSize = f_size(&fsrc);                                                                                                           //读出文件的大小,说明读取文件大小必须在打开文件后才能读出br=1;for (;;) {                                                                                                                                    //循环读出被打开文件的扇区for(a=0; a<512; a++) buffer[a]=0;                                                           //因为可以一次读出512字节,先清空数据缓冲区 res = f_read(&fsrc, buffer, sizeof(buffer), &br);                          //将文件内容读出到数据缓冲区  br存储此次读出数据的数量,最大512USART_OUT(USART1,"%s\n",buffer);                                                          //将缓冲区的内容输出到串口1if (res || br == 0) break;   // error or eof                                  //判断是否到文件结束}f_close(&fsrc);                                                                                                           //关闭源文件res1 = f_open(&fdst, "大海.txt", FA_CREATE_ALWAYS | FA_WRITE);          //以写的方式打开"大海.txt"文件if(finfo.lfname[0])                {res = f_open(&fsrc, finfo.lfname, FA_CREATE_ALWAYS | FA_WRITE);}  //以写的方式打开文件else                                           {res = f_open(&fsrc, finfo.fname,  FA_CREATE_ALWAYS | FA_WRITE); }   //8.3格式文件名 以写的方式打开文件for(a=0; a<512; a++) buffer[a]=0x36;                                                          //往buffer中写入512个6f_lseek(&fsrc,FATFSNumSize);                                                                            //偏移到打开文件内容的后面//在这里要重点说明的是如果numSize<512将会把数据覆盖,如果numSize>512切numSize%512得到的余数将会覆盖,所有如果numSize不是512的整倍数,要单独做处理//我的方法是读取这不到1个扇区的数据,放到缓冲区,然后将512-numSize%512的数据填入缓冲区,写入TF(SD)卡数据,然后再写剩余的数据br=512;                                                                                                                          //写入512个数据res1 = f_write(&fsrc, buffer, br, &bw);                                                                                                   f_close(&fsrc);//关闭目标文件 本条函数即时保存写入的数据,又是关闭目标文件,如有很多数据要写入,但不需要现在关闭可以调用f_sync函数,但是调用 f_sync前必把S_READONLY == 0可用}} } 

}


文件函数的返回代码 处理报告
void die ( FRESULT res )
{switch (res){case FR_OK:                                                USART_OUT(USART1,"FR_OK");break;case FR_DISK_ERR:                                USART_OUT(USART1,"FR_DISK_ERR");break;case FR_INT_ERR:                                USART_OUT(USART1,"FR_INT_ERR");break;case FR_NOT_READY:                                USART_OUT(USART1,"FR_NOT_READY");break;case FR_NO_FILE:                                USART_OUT(USART1,"FR_NO_FILE");break;case FR_NO_PATH:                                USART_OUT(USART1,"FR_NO_PATH");break;case FR_INVALID_NAME:                        USART_OUT(USART1,"FR_INVALID_NAME");break;case FR_DENIED:                                        USART_OUT(USART1,"FR_DENIED");break;case FR_EXIST:                                        USART_OUT(USART1,"FR_EXIST");break;case FR_INVALID_OBJECT:                        USART_OUT(USART1,"FR_INVALID_OBJECT");break;case FR_WRITE_PROTECTED:                USART_OUT(USART1,"FR_WRITE_PROTECTED");break;case FR_INVALID_DRIVE:                        USART_OUT(USART1,"FR_INVALID_DRIVE");break;case FR_NOT_ENABLED:                        USART_OUT(USART1,"FR_NOT_ENABLED");break;case FR_NO_FILESYSTEM:                        USART_OUT(USART1,"FR_NO_FILESYSTEM");break;case FR_MKFS_ABORTED:                        USART_OUT(USART1,"FR_MKFS_ABORTED");break;case FR_TIMEOUT:                                USART_OUT(USART1,"FR_TIMEOUT");break;case FR_LOCKED:                                        USART_OUT(USART1,"FR_LOCKED");break;case FR_NOT_ENOUGH_CORE:                USART_OUT(USART1,"FR_NOT_ENOUGH_CORE");break;case FR_TOO_MANY_OPEN_FILES:        USART_OUT(USART1,"FR_TOO_MANY_OPEN_FILES");break;}printf ("\r\n");
}

这篇关于【转载自amobbs IDzhcj66】FATFS读取数据问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/533530

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

题目1254:N皇后问题

题目1254:N皇后问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。 你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。 输入

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

form表单提交编码的问题

浏览器在form提交后,会生成一个HTTP的头部信息"content-type",标准规定其形式为Content-type: application/x-www-form-urlencoded; charset=UTF-8        那么我们如果需要修改编码,不使用默认的,那么可以如下这样操作修改编码,来满足需求: hmtl代码:   <meta http-equiv="Conte