c++清空一个二进制文件

c++怎样清空一个二进制文件?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

c++

3个回答

基本只要你用w模式打开文件,它就被清空了,添加trunc标识会坐实这一点:

 std::ofstream outStream;
outStream.open("your_file", std::ofstream::out | std::ofstream::trunc);
outStream.close();

SetFilePointer(hFile, 0, NULL, FILE_BEGIN); 

SetEndOfFile(hFile);
FlushFileBuffers(hFile); //先把写文件缓冲区的数据强制写入磁盘。

......
答案就在这里:根据文件句柄清空一个文件
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。

linux/unix下试试ftruncate

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c++清空一个二进制文件
c++怎样清空一个二进制文件?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
只能导入二进制注册文件,但是我怎么改格式都不行
系统漏洞补丁一直安装不上,显示0*8008005的错误代码,然后系统自带的安全中心,OneNote,计算器等都用不了了,每天打开电脑回收站自动清空。然后我在网上查到一个导入注册表的方法,可是无论是存为ANSI还是Unicode都显示只能导入二进制文件,空格空行我也注意了但就是不行。。。。 附上查到的代码: Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\wuauserv] "PreshutdownTimeout"=dword:036ee800"DisplayName"="@%systemroot%\\system32\\wuaueng.dll,-105"  "ImagePath"=hex(2):25,00,73,00,79,00,73,00,74,00,65,00,6d,00,72,00,6f,00,6f,00,\ 74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,73,\ 00,76,00,63,00,68,00,6f,00,73,00,74,00,2e,00,65,00,78,00,65,00,20,00,2d,00,\ 6b,00,20,00,6e,00,65,00,74,00,73,00,76,00,63,00,73,00,00,00  "Description"="@%systemroot%\\system32\\wuaueng.dll,-106" "ObjectName"="LocalSystem" "ErrorControl"=dword:00000001 "Start"=dword:00000002  "DelayedAutoStart"=dword:00000001 "Type"=dword:00000020  "DependOnService"=hex(7):72,00,70,00,63,00,73,00,73,00,00,00,00,00 "ServiceSidType"=dword:00000001  "RequiredPrivileges"=hex(7):53,00,65,00,41,00,75,00,64,00,69,00,74,00,50,00,72,\ 00,69,00,76,00,69,00,6c,00,65,00,67,00,65,00,00,00,53,00,65,00,43,00,72,00,\ 65,00,61,00,74,00,65,00,47,00,6c,00,6f,00,62,00,61,00,6c,00,50,00,72,00,69,\ 00,76,00,69,00,6c,00,65,00,67,00,65,00,00,00,53,00,65,00,43,00,72,00,65,00,\ 61,00,74,00,65,00,50,00,61,00,67,00,65,00,46,00,69,00,6c,00,65,00,50,00,72,\ 00,69,00,76,00,69,00,6c,00,65,00,67,00,65,00,00,00,53,00,65,00,54,00,63,00,\ 62,00,50,00,72,00,69,00,76,00,69,00,6c,00,65,00,67,00,65,00,00,00,53,00,65,\ 00,41,00,73,00,73,00,69,00,67,00,6e,00,50,00,72,00,69,00,6d,00,61,00,72,00,\ 79,00,54,00,6f,00,6b,00,65,00,6e,00,50,00,72,00,69,00,76,00,69,00,6c,00,65,\ 00,67,00,65,00,00,00,53,00,65,00,49,00,6d,00,70,00,65,00,72,00,73,00,6f,00,\ 6e,00,61,00,74,00,65,00,50,00,72,00,69,00,76,00,69,00,6c,00,65,00,67,00,65,\ 00,00,00,53,00,65,00,49,00,6e,00,63,00,72,00,65,00,61,00,73,00,65,00,51,00,\ 75,00,6f,00,74,00,61,00,50,00,72,00,69,00,76,00,69,00,6c,00,65,00,67,00,65,\ 00,00,00,53,00,65,00,53,00,68,00,75,00,74,00,64,00,6f,00,77,00,6e,00,50,00,\ 72,00,69,00,76,00,69,00,6c,00,65,00,67,00,65,00,00,00,00,00  "FailureActions"=hex:80,51,01,00,00,00,00,00,00,00,00,00,03,00,00,00,14,00,00,\ 00,01,00,00,00,60,ea,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\wuauserv\Parameters]  "ServiceDll"=hex(2):25,00,73,00,79,00,73,00,74,00,65,00,6d,00,72,00,6f,00,6f,\ 00,74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,\ 77,00,75,00,61,00,75,00,65,00,6e,00,67,00,2e,00,64,00,6c,00,6c,00,00,00 "ServiceMain"="WUServiceMain"  "ServiceDllUnloadOnStop"=dword:00000001  [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\wuauserv\Security]  "Security"=hex:01,00,14,80,78,00,00,00,84,00,00,00,14,00,00,00,30,00,00,00,02,\ 00,1c,00,01,00,00,00,02,80,14,00,ff,00,0f,00,01,01,00,00,00,00,00,01,00,00,\ 00,00,02,00,48,00,03,00,00,00,00,00,14,00,9d,00,02,00,01,01,00,00,00,00,00,\ 05,0b,00,00,00,00,00,18,00,ff,01,0f,00,01,02,00,00,00,00,00,05,20,00,00,00,\ 20,02,00,00,00,00,14,00,ff,01,0f,00,01,01,00,00,00,00,00,05,12,00,00,00,01,\ 01,00,00,00,00,00,05,12,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00
如何区分汉字"錒"和其他英文字符
![实验用文档](https://img-ask.csdn.net/upload/201612/08/1481206562_510885.png) 程序所用文档如图,我需要处理这些数据,把它变成 ![预期结果](https://img-ask.csdn.net/upload/201612/08/1481206923_940592.png) 我的代码是这样的 ```cpp #include <iostream> #include <string> #include <fstream> #include <map> #include <cstdlib> using namespace std; bool isLetterOrNumber(const char &word); bool isChinese(const char &word); int main(int argc, char* argv[]) { // 首先要打开这个文件,用二进制形式 ifstream ifs("list_t.txt", ios::binary); // 需要把结果写入一个目标文件 ofstream ofs("hz_pinyin.txt", ios::binary); // 需要一个临时存储字符 char word; // 需要一个字符串存拼音 string pinyin; // 需要一个字符串存汉字 string chinese; // 我们需要通过汉字来检索拼音,所以需要一个从string到string的map map<string, string> table; // 错误处理,如果ifs指向NULL,结束程序 if (!ifs) { cerr << "文件打开错误,请检查" << endl; exit(0); } // 打开文件后看见了下面这一行 // a1 阿啊锕呵吖腌錒 // 文件指针开始移动 while (!ifs.eof()) { // 先读取当前位置的字符 ifs.read((char*)&word, 1); // 判断读到的字符是不是英文字符和数字(因为拼音是由英文字符和数字组成的) if (isLetterOrNumber(word)) // 錒的后一个字节内容是48h,到这一句会判断为真,连入pinyin,造成后面乱码 // 放入pinyin字符串 pinyin += word; // 判断读到的字符是不是中文 else if (isChinese(word)) { // 放入chinese字符串 chinese += word; // 判断中文字符串长度是否为2,如果为2,chinese为索引,pinyin为对应值,存入map if (chinese.size() == 2) { table[chinese] = pinyin; // 以<中文><拼音>形式存入新的文件 ofs.write(chinese.c_str(), chinese.size()); ofs.write(pinyin.c_str(), pinyin.size()); // 接着清空chinese字符串,以迎接下一个汉字 chinese.clear(); // 往目标文件写入一个回车 ofs.write("\r", 1); // 往目标文件写入一个换行 ofs.write("\n", 1); } } // 如果读到了0x0D,那么清空pinyin字符串,并接着读一个0x0A else if (word == 0x0D) { pinyin.clear(); ifs.read((char*)&word, 1); } } ifs.close(); ofs.close(); return 0; } bool isLetterOrNumber(const char &word) { if ((word >= '0' && word <= '9') || (word >= 'a' && word <= 'z') || (word >= 'A' && word <= 'Z')) return true; return false; } bool isChinese(const char &word) { if ((!isLetterOrNumber(word)) && (word != ' ') && (word != '\r') && (word != '\n')) return true; return false; } ``` 生成的结果是乱码。我用winhex查看了一下,问题发生在“錒”这个字上。錒的编码是"E5 48"它第二个字节的48正好是ASCII码中'H'的位置,也就是说,当word是"錒"的第二个字节,并且处理到 ``` cpp if (isLetterOrNumber(word)) ``` 会返回true,这个48就会按照英文来处理,放到拼音字符串中。 但是问题来了:既然"錒"的第二个字节是48,而48也在ASCII中,那么怎么才能区分出我想要的这个48是"錒"的第二字节,而不是'H'ASCII字符? PS:我感觉我的markdown语法好像没有错,为什么代码没有高亮 ![图片说明](https://img-ask.csdn.net/upload/201612/08/1481208269_236469.png)
c语言 运行出错 回车怎么进行不下去了呢 是不是文件部分出错了
![图片说明](https://img-ask.csdn.net/upload/201806/13/1528883958_468190.png) #include <stdio.h> #include <malloc.h> #include <string.h> #include <stdlib.h> #define MAXSIZE 100 typedef struct NODE { char name[MAXSIZE]; int p_num; double p_price; char kind[MAXSIZE]; struct NODE *next; }node; //下面这部分是啥??? typedef struct { char name[MAXSIZE]; int p_num; double p_price; char kind[MAXSIZE]; }str; #if 0 void create(node *head); /*创建货物 main 194line*/ void del(node *head); /*删除指定货物*/ void find(node *head) /*查找货物*/ void all_delete(node *head); /*清空全部货物*/ void change(node *head); /*修改货物信息*/ int display() /*菜单*/ #endif void create(node *head) /*创建货物 main 194line*/ { node *p; /*判断货物是否存在的指针变量*/ int i = 1; char name[MAXSIZE]; int p_num; double p_price; char kind[MAXSIZE]; printf("*****************请输入货物名称:************\n"); scanf("%s",name); //getchar(); p = head->next; while(p != NULL) { if(strcmp(p->name,name) == 0) { printf("*********货物已存在************\n"); p = NULL; i = 0; /* 货物已存在,不执行输入货物命令*/ } else { p = p->next; } } while( 1 == i) { node *q; printf("**************请输入货物单位价格:**************\n"); scanf("%lf",&p_price); printf("**************请输入货物数量:**************\n"); scanf("%d",&p_num); printf("*****************请输入货物所属类型:************\n"); scanf("%s",kind); q = (node*)malloc(sizeof(node)); if(NULL == q) { printf("error2\n"); } strcpy(q->name,name); //strcpy(q->p_num,p_num); q->p_num=p_num; q->p_price=p_price; strcpy(q->kind,kind); q->next = head->next; head->next = q; /*头插法*/ i = 0; } } //我的代码跟这个的区别:没有在函数内重新定义变量 然后使用strcpy这些赋值 void order(node *head,int len1) //给货物排序 { node *p; /*用来排序的变量*/ node *q; /*同上*/ p = head->next; while(len1 > 0) /*实现货物按字母排列*/ { while(p != NULL && p->next!= NULL) { char tempname[MAXSIZE]; /*相当于中间变量用来存储货物信息*/ int tempp_num; double tempp_price; char tempkind[MAXSIZE]; if(strcmp(p->name,p->next->name) > 0) { strcpy(tempname, p->next->name); tempp_price=p->next->p_price; tempp_num=p->next->p_num; strcpy(tempkind,p->next->kind); strcpy(p->next->name,p->name); p->next->p_price=p->p_price; p->next->p_num=p->p_num; strcpy(p->next->kind,p->kind); strcpy(p->name,tempname); p->p_price=tempp_price; p->p_num=tempp_num; strcpy(p->kind,tempkind); } else { p=p->next; } } len1--; } } void print(node *head) /*打印联系人的函数*/ { int i = 1; node *p; p = head->next; printf("现在货物为:\n"); printf("编号 名称 价格 数量 所属类型\n"); while(p != NULL) { printf("%d %s %.2lf %d %s\n", i,p->name,p->p_price,p->p_num,p->kind); p = p->next; i++; } } void del(node *head) /*删除指定货物函数*/ { node *p; node *q; q = head; p = q->next; char name[MAXSIZE]; printf("************请输入要删除的货物名称:*********\n"); scanf("%s",name); while((p != NULL) && (strcmp(p->name,name) != 0)) { q = p; p = p->next; } if(NULL == p) { printf("************未查找到***************\n"); } else { q->next = p->next; free(p); printf("***********删除成功****************\n"); } } void find(node *head) //查找货物 { node *p; char name[MAXSIZE]; printf("*******请输入要查找货物名称:**********\n"); scanf("%s",name); p = head->next; while(p != NULL && strcmp(p->name,name) != 0) { p = p->next;//为什么del函数里面还定义了一个指针q } if(NULL == p) { printf("********没有这个货物*********\n"); } else { printf(" 名称:%s\n 价格:%.2lf 数量:%d 所属类型:%s", p->name,p->p_price,p->p_num,p->kind); } } void all_delete(node *head) //清空全部货物 { while(head->next != NULL) { node *q; q = head->next; head->next = q->next; free(q); } if(NULL == head->next) { printf("*********清除所有货物成功*********\n"); } } void change(node *head) //修改货物信息 { node *p; char name[MAXSIZE]; double p_price; int p_num; char kind[MAXSIZE]; p = head->next; printf("请输入要修改的货物名称\n"); scanf("%s",name); while( p != NULL) { if(strcmp(p->name,name) == 0) { printf("请输入要修改的货物价格\n"); scanf("%lf",p_price); p->p_price=p_price; printf("修改成功\n"); break; } else { p = p->next; } } if(p == NULL) { printf("未查找到此联系人!\n"); } } int sum(node *head) //求链表中有多少货物 { int count_node = 0; node *p; p = head->next; if(p != NULL) { count_node++; p = p->next; } return count_node; } void write_to_file(node *head,int len) //链表中的货物信息写到文件 { int i; str string[100]; FILE *fp = fopen("a2","wb"); if(NULL == fp) { printf("open error\n"); exit(1); } //printf("1111\n"); while( head->next != NULL) { for(i = 0;i < len;i++) { strcpy(string[i].name,head->next->name); string[i].p_num=head->next->p_num; string[i].p_price=head->next->p_price; strcpy(string[i].kind,head->next->kind); fwrite(&string[i],sizeof(str),1,fp); //依次将结构体数组写到文件 head = head->next; } } fclose(fp); } void read_to_linklist(node *head) //将文件中的数据读到链表中 { int i; int m; int j = 0; node *p; node *q; p = head; FILE *fp; fp = fopen("a2","rb"); fseek(fp,0,SEEK_END); i = ftell(fp); fseek(fp,0,SEEK_SET); m = (i/(sizeof(str))); // m :文件中有多少个联系人 str string[100]; //结构体数组,存放所有联系人 fread(string,sizeof(str),m,fp); while(m > 0) { q = (node*)malloc(sizeof(node)); strcpy(q->name,string[j].name); q->p_num=string[j].p_num; q->p_price=string[j].p_price; strcpy(q->kind,string[j].kind); m--; j++; p->next = q; p = q; } fclose(fp); } int display() //菜单 { printf( "\n**************请选择要进行的操作***********\n"); printf("-----------------------------------------------\n"); printf("*|************* 1 .添加货物******************|*\n"); printf("*|************* 2 .删除货物******************|*\n"); printf("*|**************3 .查找货物******************|*\n"); printf("*|**************4 .显示货物******************|*\n"); printf("*|**************5 .修改货物******************|*\n"); printf("*|**************6 .清空货物******************|*\n"); printf("*|**************7 .退 出******************|*\n"); printf("-----------------------------------------------"); } int main() { int a; int n = 1; node *head; node *q; head = (node*)malloc(sizeof(node)); if(NULL == head) { printf("error\n"); } q = head; head->next = NULL; read_to_linklist(q); while(n == 1) { printf("\n",display()); printf("\n**********************请输入要进行的操作**********\n\n"); scanf("%d",&a); switch(a) { case 1: while(getchar() != '\n'); create(q); order(q,sum(q)); a = 0; break; case 2: while(getchar() != '\n'); del(q); getchar(); print(q); break; case 3: find(q); break; case 4: while(getchar() != '\n'); print(q); break; case 5: while(getchar() != '\n'); change(q); break; case 6: all_delete(q); break; case 7: write_to_file(q,sum(q)); n = 0; break; default: { printf("*****输入错误,请重新选择指令:******\n"); } while(getchar() != '\n'); break; } } free(head); } //1.把显示错的那边改一下 ok //2.文件那边补充好(代码中是二进制形式,可以试试w,r)50%ok fprintf fscanf呀呀呀呀 //3.货物种类大框架 //4.把细节理解好
新手求助!!c++串口通讯,缓冲区设置失败,是结构体指针设置错误吗?求指导。
//头文件 ```class IDC_DLL_CLASS CComDevice { //串口类方法 public: CComDevice(); virtual ~CComDevice(); //打开串口 int Open(char * , LPDCB); //关闭串口 int Close(); //读串口收到的数据(一次) int Read(char *, DWORD); //读串口收到的数据(同步) int WaitRead(char *, DWORD, DWORD, DWORD); //向串口写数据(同步) int Write(char *, DWORD, DWORD); //串口类属性 public: DWORD m_error_code;//最后一次操作错误码(windows定义) DCB m_state;//串口配置 HANDLE m_handle; //串口句柄 COMMTIMEOUTS m_Timeouts;//读写超时时间 }; ``` //串口打开 int CComDevice::Open(char * Port , LPDCB lpDCB) { //操作错误码复位 this->m_error_code = 0; //判断串口是否已经打开 if (this->m_handle != NULL) { printf("串口打开失败"); return -1; } //打开串口文件 this->m_handle = ::CreateFileA(Port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); printf("打开串口文件"); printf("\n"); if (this->m_handle == INVALID_HANDLE_VALUE) { this->m_error_code = ::GetLastError();//获取错误码 this->m_handle = NULL;//串口句柄置空 printf("系统错误\n"); return -2; } try { //设置串口读写缓冲区大小 if (!SetupComm(this->m_handle, 2048, 2048)) printf("\n"); printf("设置串口读写缓冲区大小错误"); //配置失败 throw(FALSE); //终止串口所有异步读写操作并清空读写缓冲区 if (!PurgeComm(this->m_handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR)) printf("\n"); printf("终止串口所有异步读写操作并清空读写缓冲区错误"); throw(FALSE); //获取串口默认配置 if (!GetCommState(this->m_handle, &this->m_state)) printf("\n"); printf("获取串口默认配置错误"); throw(FALSE); this->m_state.DCBlength = sizeof(DCB); //DCB长度 this->m_state.BaudRate = lpDCB->BaudRate; //波特率 this->m_state.ByteSize = lpDCB->ByteSize; //通信字节位数 this->m_state.Parity = lpDCB->Parity;//奇偶校验位 this->m_state.StopBits = lpDCB->StopBits; //停止位 this->m_state.fOutxDsrFlow = lpDCB->fOutxDsrFlow; this->m_state.fDtrControl = lpDCB->fDtrControl; this->m_state.fOutxCtsFlow = lpDCB->fOutxCtsFlow; this->m_state.fRtsControl = lpDCB->fRtsControl; this->m_state.fInX = lpDCB->fInX; this->m_state.fOutX = lpDCB->fInX; this->m_state.XonChar = lpDCB->XonChar; this->m_state.XoffChar = lpDCB->XoffChar; this->m_state.XonLim = lpDCB->XonLim;//指定在XON字符发送之前接收缓冲区中空缓冲区可允许的最小字节数 this->m_state.XoffLim = lpDCB->XoffLim;//指定在XOFF字符发送之前接收缓冲区中空缓冲区可允许的最小字节数 this->m_state.fBinary = lpDCB->fBinary; this->m_state.fParity = lpDCB->fParity; //设置串口制订配置 if (!SetCommState(this->m_handle, &(this->m_state))) printf("\n"); printf("配置错误"); throw(FALSE); } catch (BOOL) { this->m_error_code = ::GetLastError();//获取错误码 ::CloseHandle(this->m_handle);//关闭串口 this->m_handle = NULL;//串口句柄置空 printf("\n串口错误"); //------>程序运行到这里卡住 return -1; } printf("打开串口成功"); return 0; } ``` //main函数打开串口 `int _tmain(int argc, _TCHAR* argv[]) { CComDevice CardReader; DCB DCB_COM; DCB_COM.DCBlength = 50; DCB_COM.BaudRate = CBR_9600; // 设置波特率9600 DCB_COM.fBinary = TRUE; // 设置二进制模式,此处必须设置TRUE DCB_COM.fParity = TRUE; // 支持奇偶校验 DCB_COM.fOutxCtsFlow = FALSE; // No CTS output flow control DCB_COM.fOutxDsrFlow = FALSE; // No DSR output flow control DCB_COM.fDtrControl = DTR_CONTROL_DISABLE; // No DTR flow control DCB_COM.XonChar = 0; DCB_COM.XoffChar = 0; DCB_COM.XonLim = 100; DCB_COM.XoffLim = 100; //DCB_COM.fDsrSensitivity = FALSE; // DSR sensitivity //DCB_COM.fTXContinueOnXoff = TRUE; // XOFF continues Tx DCB_COM.fOutX = FALSE; // No XON/XOFF out flow control DCB_COM.fInX = FALSE; // No XON/XOFF in flow control //DCB_COM.fErrorChar = FALSE; // Disable error replacement //DCB_COM.fNull = FALSE; // Disable null stripping DCB_COM.fRtsControl = RTS_CONTROL_DISABLE; //No RTS flow control //DCB_COM.fAbortOnError = FALSE; // 当串口发生错误,并不终止串口读写 DCB_COM.ByteSize = 8; // 数据位,范围:4-8 DCB_COM.Parity = NOPARITY; // 校验模式 DCB_COM.StopBits = 0; // 1位停止位 int a = CardReader.Open("COM5", &DCB_COM); cout << "\na:" << a << endl; system("pause"); return 0; }`` ``` ![图片说明](https://img-ask.csdn.net/upload/201905/27/1558924537_857227.png)
huffman树编码压缩解压 压缩码表
// 压缩函数 int compress(char *ifname, char *ofname) { unsigned int i, j; unsigned int char_kinds; // 字符种类 unsigned char char_temp; // 暂存8bits字符 unsigned long file_len = 0; FILE *infile, *outfile; TmpNode node_temp; unsigned int node_num; HufTree huf_tree; char code_buf[256] = "\0"; // 待存编码缓冲区 unsigned int code_len; /* ** 动态分配256个结点,暂存字符频度, ** 统计并拷贝到树结点后立即释放 */ TmpNode *tmp_nodes =(TmpNode *)malloc(256*sizeof(TmpNode)); // 初始化暂存结点 for(i = 0; i < 256; ++i) { tmp_nodes[i].weight = 0; tmp_nodes[i].uch = (unsigned char)i; // 数组的256个下标与256种字符对应 } // 遍历文件,获取字符频度 infile = fopen(ifname, "rb"); // 判断输入文件是否存在 if (infile == NULL) return -1; fread((char *)&char_temp, sizeof(unsigned char), 1, infile); // 读入一个字符 while(!feof(infile)) { ++tmp_nodes[char_temp].weight; // 统计下标对应字符的权重,利用数组的随机访问快速统计字符频度 ++file_len; fread((char *)&char_temp, sizeof(unsigned char), 1, infile); // 读入一个字符 } fclose(infile); // 排序,将频度为零的放最后,剔除 for(i = 0; i < 256-1; ++i) for(j = i+1; j < 256; ++j) if(tmp_nodes[i].weight < tmp_nodes[j].weight) { node_temp = tmp_nodes[i]; tmp_nodes[i] = tmp_nodes[j]; tmp_nodes[j] = node_temp; } // 统计实际的字符种类(出现次数不为0) for(i = 0; i < 256; ++i) if(tmp_nodes[i].weight == 0) break; char_kinds = i; if (char_kinds == 1) { outfile = fopen(ofname, "wb"); // 打开压缩后将生成的文件 fwrite((char *)&char_kinds, sizeof(unsigned int), 1, outfile); // 写入字符种类 fwrite((char *)&tmp_nodes[0].uch, sizeof(unsigned char), 1, outfile); // 写入唯一的字符 fwrite((char *)&tmp_nodes[0].weight, sizeof(unsigned long), 1, outfile); // 写入字符频度,也就是文件长度 free(tmp_nodes); fclose(outfile); } else { node_num = 2 * char_kinds - 1; // 根据字符种类数,计算建立哈夫曼树所需结点数 huf_tree = (HufNode *)malloc(node_num*sizeof(HufNode)); // 动态建立哈夫曼树所需结点 // 初始化前char_kinds个结点 for(i = 0; i < char_kinds; ++i) { // 将暂存结点的字符和频度拷贝到树结点 huf_tree[i].uch = tmp_nodes[i].uch; huf_tree[i].weight = tmp_nodes[i].weight; huf_tree[i].parent = 0; } free(tmp_nodes); // 释放字符频度统计的暂存区 // 初始化后node_num-char_kins个结点 for(; i < node_num; ++i) huf_tree[i].parent = 0; CreateTree(huf_tree, char_kinds, node_num); // 创建哈夫曼树 HufCode(huf_tree, char_kinds); // 生成哈夫曼编码 // 写入字符和相应权重,供解压时重建哈夫曼树 outfile = fopen(ofname, "wb"); // 打开压缩后将生成的文件 fwrite((char *)&char_kinds, sizeof(unsigned int), 1, outfile); // 写入字符种类 for(i = 0; i < char_kinds; ++i) { fwrite((char *)&huf_tree[i].uch, sizeof(unsigned char), 1, outfile); // 写入字符(已排序,读出后顺序不变) fwrite((char *)&huf_tree[i].weight, sizeof(unsigned long), 1, outfile); // 写入字符对应权重 } // 紧接着字符和权重信息后面写入文件长度和字符编码 fwrite((char *)&file_len, sizeof(unsigned long), 1, outfile); // 写入文件长度 infile = fopen(ifname, "rb"); // 以二进制形式打开待压缩的文件 fread((char *)&char_temp, sizeof(unsigned char), 1, infile); // 每次读取8bits while(!feof(infile)) { // 匹配字符对应编码 for(i = 0; i < char_kinds; ++i) if(char_temp == huf_tree[i].uch) strcat(code_buf, huf_tree[i].code); // 以8位(一个字节长度)为处理单元 while(strlen(code_buf) >= 8) { char_temp = '\0'; // 清空字符暂存空间,改为暂存字符对应编码 for(i = 0; i < 8; ++i) { char_temp <<= 1; // 左移一位,为下一个bit腾出位置 if(code_buf[i] == '1') char_temp |= 1; // 当编码为"1",通过或操作符将其添加到字节的最低位 } fwrite((char *)&char_temp, sizeof(unsigned char), 1, outfile); // 将字节对应编码存入文件 strcpy(code_buf, code_buf+8); // 编码缓存去除已处理的前八位 } fread((char *)&char_temp, sizeof(unsigned char), 1, infile); // 每次读取8bits } // 处理最后不足8bits编码 code_len = strlen(code_buf); if(code_len > 0) { char_temp = '\0'; for(i = 0; i < code_len; ++i) { char_temp <<= 1; if(code_buf[i] == '1') char_temp |= 1; } char_temp <<= 8-code_len; // 将编码字段从尾部移到字节的高位 fwrite((char *)&char_temp, sizeof(unsigned char), 1, outfile); // 存入最后一个字节 } // 关闭文件 fclose(infile); fclose(outfile); // 释放内存 for(i = 0; i < char_kinds; ++i) free(huf_tree[i].code); free(huf_tree); } }//compress 代码如上 不懂的就是压缩后码表的部分 希望各位懂得帮帮忙 huffman树以及码表如下图,求解释码表下半部分引出部分。
huffman编码压缩的码表看不懂求解
// 压缩函数 int compress(char ifname, char *ofname) { unsigned int i, j; unsigned int char_kinds; // 字符种类 unsigned char char_temp; // 暂存8bits字符 unsigned long file_len = 0; FILE *infile, *outfile; TmpNode node_temp; unsigned int node_num; HufTree huf_tree; char code_buf[256] = "\0"; // 待存编码缓冲区 unsigned int code_len; / ** 动态分配256个结点,暂存字符频度, ** 统计并拷贝到树结点后立即释放 */ TmpNode *tmp_nodes =(TmpNode *)malloc(256*sizeof(TmpNode)); // 初始化暂存结点 for(i = 0; i < 256; ++i) { tmp_nodes[i].weight = 0; tmp_nodes[i].uch = (unsigned char)i; // 数组的256个下标与256种字符对应 } // 遍历文件,获取字符频度 infile = fopen(ifname, "rb"); // 判断输入文件是否存在 if (infile == NULL) return -1; fread((char *)&char_temp, sizeof(unsigned char), 1, infile); // 读入一个字符 while(!feof(infile)) { ++tmp_nodes[char_temp].weight; // 统计下标对应字符的权重,利用数组的随机访问快速统计字符频度 ++file_len; fread((char *)&char_temp, sizeof(unsigned char), 1, infile); // 读入一个字符 } fclose(infile); // 排序,将频度为零的放最后,剔除 for(i = 0; i < 256-1; ++i) for(j = i+1; j < 256; ++j) if(tmp_nodes[i].weight < tmp_nodes[j].weight) { node_temp = tmp_nodes[i]; tmp_nodes[i] = tmp_nodes[j]; tmp_nodes[j] = node_temp; } // 统计实际的字符种类(出现次数不为0) for(i = 0; i < 256; ++i) if(tmp_nodes[i].weight == 0) break; char_kinds = i; if (char_kinds == 1) { outfile = fopen(ofname, "wb"); // 打开压缩后将生成的文件 fwrite((char *)&char_kinds, sizeof(unsigned int), 1, outfile); // 写入字符种类 fwrite((char *)&tmp_nodes[0].uch, sizeof(unsigned char), 1, outfile); // 写入唯一的字符 fwrite((char *)&tmp_nodes[0].weight, sizeof(unsigned long), 1, outfile); // 写入字符频度,也就是文件长度 free(tmp_nodes); fclose(outfile); } else { node_num = 2 * char_kinds - 1; // 根据字符种类数,计算建立哈夫曼树所需结点数 huf_tree = (HufNode *)malloc(node_num*sizeof(HufNode)); // 动态建立哈夫曼树所需结点 // 初始化前char_kinds个结点 for(i = 0; i < char_kinds; ++i) { // 将暂存结点的字符和频度拷贝到树结点 huf_tree[i].uch = tmp_nodes[i].uch; huf_tree[i].weight = tmp_nodes[i].weight; huf_tree[i].parent = 0; } free(tmp_nodes); // 释放字符频度统计的暂存区 // 初始化后node_num-char_kins个结点 for(; i < node_num; ++i) huf_tree[i].parent = 0; CreateTree(huf_tree, char_kinds, node_num); // 创建哈夫曼树 HufCode(huf_tree, char_kinds); // 生成哈夫曼编码 // 写入字符和相应权重,供解压时重建哈夫曼树 outfile = fopen(ofname, "wb"); // 打开压缩后将生成的文件 fwrite((char *)&char_kinds, sizeof(unsigned int), 1, outfile); // 写入字符种类 for(i = 0; i < char_kinds; ++i) { fwrite((char *)&huf_tree[i].uch, sizeof(unsigned char), 1, outfile); // 写入字符(已排序,读出后顺序不变) fwrite((char *)&huf_tree[i].weight, sizeof(unsigned long), 1, outfile); // 写入字符对应权重 } // 紧接着字符和权重信息后面写入文件长度和字符编码 fwrite((char *)&file_len, sizeof(unsigned long), 1, outfile); // 写入文件长度 infile = fopen(ifname, "rb"); // 以二进制形式打开待压缩的文件 fread((char *)&char_temp, sizeof(unsigned char), 1, infile); // 每次读取8bits while(!feof(infile)) { // 匹配字符对应编码 for(i = 0; i < char_kinds; ++i) if(char_temp == huf_tree[i].uch) strcat(code_buf, huf_tree[i].code); // 以8位(一个字节长度)为处理单元 while(strlen(code_buf) >= 8) { char_temp = '\0'; // 清空字符暂存空间,改为暂存字符对应编码 for(i = 0; i < 8; ++i) { char_temp <<= 1; // 左移一位,为下一个bit腾出位置 if(code_buf[i] == '1') char_temp |= 1; // 当编码为"1",通过或操作符将其添加到字节的最低位 } fwrite((char *)&char_temp, sizeof(unsigned char), 1, outfile); // 将字节对应编码存入文件 strcpy(code_buf, code_buf+8); // 编码缓存去除已处理的前八位 } fread((char *)&char_temp, sizeof(unsigned char), 1, infile); // 每次读取8bits } // 处理最后不足8bits编码 code_len = strlen(code_buf); if(code_len > 0) { char_temp = '\0'; for(i = 0; i < code_len; ++i) { char_temp <<= 1; if(code_buf[i] == '1') char_temp |= 1; } char_temp <<= 8-code_len; // 将编码字段从尾部移到字节的高位 fwrite((char *)&char_temp, sizeof(unsigned char), 1, outfile); // 存入最后一个字节 } // 关闭文件 fclose(infile); fclose(outfile); // 释放内存 for(i = 0; i < char_kinds; ++i) free(huf_tree[i].code); free(huf_tree); } }//compress 代码如上 不懂的就是压缩后码表的部分 希望各位懂得帮帮忙 huffman树以及码表如
动态规划入门到熟悉,看不懂来打我啊
持续更新。。。。。。 2.1斐波那契系列问题 2.2矩阵系列问题 2.3跳跃系列问题 3.1 01背包 3.2 完全背包 3.3多重背包 3.4 一些变形选讲 2.1斐波那契系列问题 在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n&gt;=2,n∈N*)根据定义,前十项为1, 1, 2, 3...
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
防劝退!数据结构和算法难理解?可视化动画带你轻松透彻理解!
大家好,我是 Rocky0429,一个连数据结构和算法都不会的蒟蒻… 学过数据结构和算法的都知道这玩意儿不好学,没学过的经常听到这样的说法还没学就觉得难,其实难吗?真难! 难在哪呢?当年我还是个小蒟蒻,初学数据结构和算法的时候,在忍着枯燥看完定义原理,之后想实现的时候,觉得它们的过程真的是七拐八绕,及其难受。 在简单的链表、栈和队列这些我还能靠着在草稿上写写画画理解过程,但是到了数论、图...
【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star!【Java学习 面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。欢迎 Star!)。 另外推荐一篇原创:终极推荐!可能是最适合你的Java学习路线 方法 网站 书籍推荐! Java 并发基础常见面试题总结 1. 什么是线程和进程? 1.1. 何为进程? 进程是程...
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给
shell脚本:备份数据库、代码上线
备份MySQL数据库 场景: 一台MySQL服务器,跑着5个数据库,在没有做主从的情况下,需要对这5个库进行备份 需求: 1)每天备份一次,需要备份所有的库 2)把备份数据存放到/data/backup/下 3)备份文件名称格式示例:dbname-2019-11-23.sql 4)需要对1天以前的所有sql文件压缩,格式为gzip 5)本地数据保留1周 6)需要把备份的数据同步到远程备份中心,假如...
iOS Bug 太多,苹果终于坐不住了!
开源的 Android 和闭源的 iOS,作为用户的你,更偏向哪一个呢? 整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 毋庸置疑,当前移动设备操作系统市场中,Android 和 iOS 作为两大阵营,在相互竞争的同时不断演进。不过一直以来,开源的 Android 吸引了无数的手机厂商涌入其中,为其生态带来了百花齐放的盛景,但和神秘且闭源的 iOS 系统相比,不少网友...
神经⽹络可以计算任何函数的可视化证明
《Neural Networks and Deep Learning》读书笔记第四篇本章其实和前面章节的关联性不大,所以大可将本章作为小短文来阅读,当然基本的深度学习基础还是要有的。主要介绍了神经⽹络拥有的⼀种普遍性,比如说不管目标函数是怎样的,神经网络总是能够对任何可能的输入,其值(或者说近似值)是网络的输出,哪怕是多输入和多输出也是如此,我们大可直接得出一个结论:不论我们想要计算什么样的函数,...
聊聊C语言和指针的本质
坐着绿皮车上海到杭州,24块钱,很宽敞,在火车上非正式地聊几句。 很多编程语言都以 “没有指针” 作为自己的优势来宣传,然而,对于C语言,指针却是与生俱来的。 那么,什么是指针,为什么大家都想避开指针。 很简单, 指针就是地址,当一个地址作为一个变量存在时,它就被叫做指针,该变量的类型,自然就是指针类型。 指针的作用就是,给出一个指针,取出该指针指向地址处的值。为了理解本质,我们从计算机模型说起...
为什么你学不过动态规划?告别动态规划,谈谈我的经验
动态规划难吗?说实话,我觉得很难,特别是对于初学者来说,我当时入门动态规划的时候,是看 0-1 背包问题,当时真的是一脸懵逼。后来,我遇到动态规划的题,看的懂答案,但就是自己不会做,不知道怎么下手。就像做递归的题,看的懂答案,但下不了手,关于递归的,我之前也写过一篇套路的文章,如果对递归不大懂的,强烈建议看一看:为什么你学不会递归,告别递归,谈谈我的经验 对于动态规划,春招秋招时好多题都会用到动态...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
如何安装 IntelliJ IDEA 最新版本——详细教程
IntelliJ IDEA 简称 IDEA,被业界公认为最好的 Java 集成开发工具,尤其在智能代码助手、代码自动提示、代码重构、代码版本管理(Git、SVN、Maven)、单元测试、代码分析等方面有着亮眼的发挥。IDEA 产于捷克,开发人员以严谨著称的东欧程序员为主。IDEA 分为社区版和付费版两个版本。 我呢,一直是 Eclipse 的忠实粉丝,差不多十年的老用户了。很早就接触到了 IDEA...
面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)
Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性...
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
为什么要推荐大家学习字节码?
配套视频: 为什么推荐大家学习Java字节码 https://www.bilibili.com/video/av77600176/ 一、背景 本文主要探讨:为什么要学习 JVM 字节码? 可能很多人会觉得没必要,因为平时开发用不到,而且不学这个也没耽误学习。 但是这里分享一点感悟,即人总是根据自己已经掌握的知识和技能来解决问题的。 这里有个悖论,有时候你觉得有些技术没用恰恰是...
互联网公司的裁员,能玩出多少种花样?
裁员,也是一门学问,可谓博大精深!以下,是互联网公司的裁员的多种方法:-正文开始-135岁+不予续签的理由:千禧一代网感更强。95后不予通过试用期的理由:已婚已育员工更有责任心。2通知接下来要过苦日子,让一部分不肯同甘共苦的员工自己走人,以“兄弟”和“非兄弟”来区别员工。3强制996。员工如果平衡不了工作和家庭,可在离婚或离职里二选一。4不布置任何工作,但下班前必须提交千字工作日报。5不给活干+...
【超详细分析】关于三次握手与四次挥手面试官想考我们什么?
在面试中,三次握手和四次挥手可以说是问的最频繁的一个知识点了,我相信大家也都看过很多关于三次握手与四次挥手的文章,今天的这篇文章,重点是围绕着面试,我们应该掌握哪些比较重要的点,哪些是比较被面试官给问到的,我觉得如果你能把我下面列举的一些点都记住、理解,我想就差不多了。 三次握手 当面试官问你为什么需要有三次握手、三次握手的作用、讲讲三次三次握手的时候,我想很多人会这样回答: 首先很多人会先讲下握...
新程序员七宗罪
当我发表这篇文章《为什么每个工程师都应该开始考虑开发中的分析和编程技能呢?》时,我从未想到它会对读者产生如此积极的影响。那些想要开始探索编程和数据科学领域的人向我寻求建议;还有一些人问我下一篇文章的发布日期;还有许多人询问如何顺利过渡到这个职业。我非常鼓励大家继续分享我在这个旅程的经验,学习,成功和失败,以帮助尽可能多的人过渡到一个充满无数好处和机会的职业生涯。亲爱的读者,谢谢你。 -罗伯特。 ...
活到老,学到老,程序员也该如此
全文共2763字,预计学习时长8分钟 图片来源:Pixabay 此前,“网传阿里巴巴要求尽快实现P8全员35周岁以内”的消息闹得沸沸扬扬。虽然很快被阿里辟谣,但苍蝇不叮无缝的蛋,无蜜不招彩蝶蜂。消息从何而来?真相究竟怎样?我们无从而知。我们只知道一个事实:不知从何时开始,程序猿也被划在了“吃青春饭”行业之列。 饱受“996ICU”摧残后,好不容易“头秃了变强了”,即将步入为“高...
Vue快速实现通用表单验证
本文开篇第一句话,想引用鲁迅先生《祝福》里的一句话,那便是:“我真傻,真的,我单单知道后端整天都是CRUD,我没想到前端整天都是Form表单”。这句话要从哪里说起呢?大概要从最近半个月的“全栈工程师”说起。项目上需要做一个城市配载的功能,顾名思义,就是通过框选和拖拽的方式在地图上完成配载。博主选择了前后端分离的方式,在这个过程中发现:首先,只要有依赖jQuery的组件,譬如Kendoui,即使使用...
2019年Spring Boot面试都问了什么?快看看这22道面试题!
Spring Boot 面试题 1、什么是 Spring Boot? 2、Spring Boot 有哪些优点? 3、什么是 JavaConfig? 4、如何重新加载 Spring Boot 上的更改,而无需重新启动服务器? 5、Spring Boot 中的监视器是什么? 6、如何在 Spring Boot 中禁用 Actuator 端点安全性? 7、如何在自定义端口上运行 Sprin...
【图解】记一次手撕算法面试:字节跳动的面试官把我四连击了
字节跳动这家公司,应该是所有秋招的公司中,对算法最重视的一个了,每次面试基本都会让你手撕算法,今天这篇文章就记录下当时被问到的几个算法题,并且每个算法题我都详细着给出了最优解,下面再现当时的面试场景。看完一定让你有所收获 一、小牛试刀:有效括号 大部分情况下,面试官都会问一个不怎么难的问题,不过你千万别太开心,因为这道题往往可以拓展出更多有难度的问题,或者一道题看起来很简单,但是给出最优解,确实很...
关于裁员几点看法及建议
最近网易裁员事件引起广泛关注,昨天网易针对此事,也发了声明,到底谁对谁错,孰是孰非?我们作为吃瓜观众实在是知之甚少,所以不敢妄下定论。身处软件开发这个行业,近一两年来,对...
面试官:关于Java性能优化,你有什么技巧
通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。 一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。 1.对象的生成和大小的调整。 J...
【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?
版权声明:本文为苦逼的码农原创。未经同意禁止任何形式转载,特别是那些复制粘贴到别的平台的,否则,必定追究。欢迎大家多多转发,谢谢。 小秋今天去面试了,面试官问了一个与敏感词过滤算法相关的问题,然而小秋对敏感词过滤算法一点也没听说过。于是,有了下下事情的发生… 面试官开怼 面试官:玩过王者荣耀吧?了解过敏感词过滤吗?,例如在游戏里,如果我们发送“你在干嘛?麻痹演员啊你?”,由于“麻痹”是一个敏感词,...
程序员需要了解的硬核知识之汇编语言(一)
之前的系列文章从 CPU 和内存方面简单介绍了一下汇编语言,但是还没有系统的了解一下汇编语言,汇编语言作为第二代计算机语言,会用一些容易理解和记忆的字母,单词来代替一个特定的指令,作为高级编程语言的基础,有必要系统的了解一下汇编语言,那么本篇文章希望大家跟我一起来了解一下汇编语言。 汇编语言和本地代码 我们在之前的文章中探讨过,计算机 CPU 只能运行本地代码(机器语言)程序,用 C 语言等高级语...
GitHub 标星 1.6w+,我发现了一个宝藏项目,作为编程新手有福了!
大家好,我是 Rocky0429,一个最近老在 GitHub 上闲逛的蒟蒻… 特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚。当时一方面是因为菜,看着这种全是英文的东西难受,不知道该怎么去玩,另一方面是一直在搞 ACM,没有做一些工程类的项目,所以想当然的以为和 GitHub 也没什么关系(当然这种想法是错误的)。 后来自己花了一个星期看完了 Pyt...
java知识体系整理,学会了,月入过万不是梦
欢迎关注个人公众号:程序猿学社 前言: 一转眼,工作4年了,正式写博客也有一年多了,之前就有整理和总结的习惯,只是都记录在有道云,感觉知识点都是很凌乱,花时间系统整理下,该文会一直同步更新,有不足之处,希望各位同行指正,既然,选择做技术这行,就得有分享的精神,而不是抱着别人会超过你的心理。希望各位博友们互相交流,互相进步。 目录 java系统学习 小白也能...
2020年去一线大厂面试先过SSM框架源码这一关!
SSM框架介绍 (1)持久层(Mybatis):Dao层(mapper) DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此。 DAO层的设计首先是设计DAO的接口。 然后在Spring的配置文件中定义此接口的实现类。 然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰。 DAO层的数据源配置,以及有...
教你一键快速生成后台代码,这样和测试小姐姐聊天的时间又多了
教你一键快速生成后台代码,咋们作为开发人员,应该把时间精力放在业务逻辑的实现上面。
Java程序员必备基础:内部类解析
前言 整理了一下内部类的相关知识,算是比较全,比较基础的,希望大家一起学习进步。 一、什么是内部类? 在Java中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类。内部类本身就是类的一个属性,与其他属性 定义方式一致。 一个内部类的例子: public class Outer { private int radius = 1; public static int co...
北漂女程序员工作6年面试JD要价28K
写在开头: 上周面试了一位女程序员,上午10::30来我们部门面试,2B哥接待了她. 大家来看看她的简历: 个人简历 个人技能: ● 熟悉spring mvc 、spring、mybatis 等框架 ● 熟悉 redis 、rocketmq、dubbo、zookeeper、netty 、nginx、tomcat、mysql。 ● 阅读过juc 中的线程池、锁的源码以及netty 中的主从多线程...
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
人脸生成黑科技:实现人脸转变特效,让人脸自动戴墨镜
上一节我们通过VAE网络完成了人脸生成效果。VAE网络一个特性是会把人脸编码成一个含有200个分量的向量,反过来说在特定分布范围内的含有200个分量的向量就对应一张人脸。由于向量之间可以进行运算,这就意味着我们把两张不同人脸A,B分布转换成两个不同向量z_A,z_B,然后我们使用向量运算例如z_AB = z_A *(1 - alpha) + z_B *alpha,就能将两个向量以一定比例合成一个新...
Java9到Java13各版本新特性代码全部详解(全网独家原创)
Java现在已经发展到了Java13了(正式版本),相信很多朋友还对各个版本还不是很熟悉,这里面专门把Java9到Java13各个版本的一些新特性做了一些详细讲解。我在网上也找了很多,但基本都是官方文档的CV,没有任何代码演示,而且官方的示例代码也不是很好找得到,官方API目前还是Java10,官方文档真是坑啊。所以我在这里专门写了一篇文章,主要针对平时开发与有关的功能Java9到Java13各...
一文带你看清 HTTP 所有概念
上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就来深究一下 HTTP 的特性。我们接着上篇文章没有说完的 HTTP 标头继续来介绍(此篇文章会介绍所有标头的概念,但没有深入底层) HTTP 标头 先来回顾一下 HTTP1.1 标头都有哪几种 HTTP 1.1 的标头主要分为四种,通用标头、实体标头、请求标头、响应标头,现在我们来对这几种标头进行介绍 通用...
春节不出门!这三款超好评编程游戏,好玩到停不下来
By 超神经场景描述:春节马上就要来临,在这个假期里,怎么能让自己放松,又不至于生疏了自己的老本行?不妨来玩一下编程向的小游戏吧,超神经在此整理了三款好玩有趣又有深度的游戏,快看看是不是...
相关热词 c# 时间比天数 c# oracle查询 c# 主动推送 事件 c# java 属性 c# 控制台 窗体 c# 静态类存值 c#矢量作图 c#窗体调用外部程式 c# enum是否合法 c# 如何卸载引用
立即提问