怎么把std::iostream这种类型的数据保存到文件中?

在Linux C++中使用别人提供的SDK获取到std::futurestd::shared_ptr<std::iostream>这种类型的音频数据,该怎么把这种类型的数据保存到音频文件中?
在使用下面的code进行保存的时候,编译的时候提示:

std::ofstream out("result.mp3");  
     if (out.is_open())   
    {  
         out.write(str1,strlen(str1));;  //str1是std::future<std::shared_ptr<std::iostream>> 类型数据
         out.close();  
     } 

 cannot convert ‘std::future<std::shared_ptr<std::basic_iostream<char> > >’ to ‘const char*’ for argument ‘1’ to ‘size_t strlen(const char*)’

或者是需要把std::futurestd::shared_ptr<std::iostream>类型进行转换一下,该怎么转换?

4个回答

已经解决了。
把out.write(str1,strlen(str1)); 改为:  out << attachmentReader.get()->rdbuf();

在线等,哪位大神帮忙回答一下。非常感谢!
本人是做android java的,对这个不了解

str1.read()把数据读到char数组中,再把char数组用out.write()写入。
如果数据很大要分段循环读、写。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
SCIK Ranger3得到了3D图像数据以二进制格式保存到了计算机中,将二进制文件读取成文本文件的格式,读取后数据有问题
计算机从相机中得到了两个文件 1.包含图像数据的二进制文件 2.用于描述二进制文件的 XML 文件 ![图片说明](https://img-ask.csdn.net/upload/202003/08/1583651424_811484.png) 其中xml文件内容如下: ![图片说明](https://img-ask.csdn.net/upload/202003/08/1583651611_816750.png) 我将数据读出来,发现有些数据特别大,有些又特别小 ![图片说明](https://img-ask.csdn.net/upload/202003/08/1583654207_110922.png) ![图片说明](https://img-ask.csdn.net/upload/202003/08/1583654231_930386.png) 请问需要怎么改进 代码如下: ``` #include<iostream> #include <fstream> #include <string> #include<vector> using namespace std; void DataRead_CPPMode(string path); int main() { string path;//文件路径 path = "img-0.dat"; DataRead_CPPMode(path); system("pause"); return 0; } /* 读二进制文件 path: 文件路径 */ void DataRead_CPPMode(string path) { //每次读取3个 double pos_in[3]; ifstream infile(path, ios::binary); if (!infile) { cout << "读取文件失败" << endl; return; } //写出 ofstream outfile("dianyun.txt"); if (!outfile) { cerr << "open error!" << endl; exit(1); } while (!infile.eof()) { infile.read((char*)pos_in, 3 * sizeof(double)); for (int i = 0; i < 3; i++) { cout << pos_in[i] << "\t"; outfile << pos_in[i] << "\t"; } cout << endl; outfile << endl; } infile.close(); outfile.close(); } ```
c++中如何提取文件每一行的一部分
![图片说明](https://img-ask.csdn.net/upload/201608/13/1471049571_518733.png) 以下是我写的一段程序,可是编译时却出现了 error C2664: 'void __thiscall std::basic_ifstream<char,struct std::char_traits<char> >::open(const char *,int)' : cannot convert parameter 1 from 'class std::basic_string<c har,struct std::char_traits<char>,class std::allocator<char> >' to 'const char *' No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 执行 cl.exe 时出错. 很苦恼,希望各路大神指教 我写的程序: #include <iostream> #include <fstream> #include <string> #include <vector> using namespace std; int main() { vector<float> vec_num; string filename,line; cout << "请输入要处理的图像路径:" << endl; cin >> filename; ifstream file; file.open(filename); if (!file.is_open()) { cout << "有错误!文件未被打开\n"; } while(getline(file, line)) { float first_num,second_num; int third_num; sscanf(line.c_str(), "%f %f %d", &first_num, &second_num, &third_num);//格式化提取 cout << first_num << " " << second_num << " " << third_num << endl;//打印一下数据 //用vector把第一列的数据存下来 vec_num.push_back(first_num); } float avg_num = 0.0;//保存计算出来的平均数结果 //遍历vector vector<float>::iterator it; for(it = vec_num.begin(); it != vec_num.end(); it++) { avg_num += *it; } avg_num = avg_num / vec_num.size(); cout << "第一列平均数是:" << avg_num << endl; system("pause"); return 0; }
关于PCL学习的问题,IO学习出现的错误
代码是:#include<iostream> #include<pcl/io/pcd_io.h> #include<pcl/point_types.h> using namespace std; int main() { pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>); //if(pcl::io::loadPCDFile<pcl::PointXYZRGBA>("frame_00000.pcd", *cloud) == -1); sensor_msgs::PointCloud2 cloud_blob; pcl::io::loadPCDFile("rabbit",cloud_blob); pcl::fromROSMsg(cloud_blob,*cloud); for(size_t i=0;i<cloud->points.size();++i) cout<<" "<<cloud->points[i].x<<" "<<cloud->points[i].y<<" "<<cloud->points[i].z<<endl; return 0; } 错误是: >d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\point_traits.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\point_cloud.h(1021): warning C4521: “pcl::PointCloud<Eigen::MatrixXf>”: 指定了多个复制构造函数 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\point_traits.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\point_traits.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1008): warning C4996: 'pcl::SHOT': USE SHOT352 FOR SHAPE AND SHOT1344 FOR SHAPE+COLOR INSTEAD 1> d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1003) : 参见“pcl::SHOT”的声明 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1009): warning C4996: 'pcl::SHOT': USE SHOT352 FOR SHAPE AND SHOT1344 FOR SHAPE+COLOR INSTEAD 1> d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1003) : 参见“pcl::SHOT”的声明 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1012): warning C4996: 'pcl::SHOT::rf': USE SHOT352 FOR SHAPE AND SHOT1344 FOR SHAPE+COLOR INSTEAD 1> d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1005) : 参见“pcl::SHOT::rf”的声明 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1013): warning C4996: 'pcl::SHOT::descriptor': USE SHOT352 FOR SHAPE AND SHOT1344 FOR SHAPE+COLOR INSTEAD 1> d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1004) : 参见“pcl::SHOT::descriptor”的声明 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1014): warning C4996: 'pcl::SHOT::descriptor': USE SHOT352 FOR SHAPE AND SHOT1344 FOR SHAPE+COLOR INSTEAD 1> d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1004) : 参见“pcl::SHOT::descriptor”的声明 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1014): warning C4996: 'pcl::SHOT::descriptor': USE SHOT352 FOR SHAPE AND SHOT1344 FOR SHAPE+COLOR INSTEAD 1> d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\impl\point_types.hpp(1004) : 参见“pcl::SHOT::descriptor”的声明 1>d:\program files (x86)\pcl 1.6.0\include\pcl-1.6\pcl\point_cloud.h(603): warning C4521: “pcl::PointCloud<PointT>”: 指定了多个复制构造函数 1> with 1> [ 1> PointT=pcl::PointXYZRGB 1> ] 1> g:\c++\icp\icp\main.cpp(7): 参见对正在编译的类 模板 实例化“pcl::PointCloud<PointT>”的引用 1> with 1> [ 1> PointT=pcl::PointXYZRGB 1> ] 1>main.obj : error LNK2019: 无法解析的外部符号 "public: int __thiscall pcl::PCDReader::read(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,struct sensor_msgs::PointCloud2 &,int)" (?read@PCDReader@pcl@@QAEHABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AAUPointCloud2@sensor_msgs@@H@Z),该符号在函数 "int __cdecl pcl::io::loadPCDFile(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,struct sensor_msgs::PointCloud2 &)" (?loadPCDFile@io@pcl@@YAHABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AAUPointCloud2@sensor_msgs@@@Z) 中被引用 1>main.obj : error LNK2001: 无法解析的外部符号 "public: virtual int __thiscall pcl::PCDReader::readHeader(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,struct sensor_msgs::PointCloud2 &,class Eigen::Matrix<float,4,1,0,4,1> &,class Eigen::Quaternion<float,0> &,int &,int &,unsigned int &,int)" (?readHeader@PCDReader@pcl@@UAEHABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AAUPointCloud2@sensor_msgs@@AAV?$Matrix@M$03$00$0A@$03$00@Eigen@@AAV?$Quaternion@M$0A@@8@AAH4AAIH@Z) 1>main.obj : error LNK2001: 无法解析的外部符号 "public: virtual int __thiscall pcl::PCDReader::read(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,struct sensor_msgs::PointCloud2 &,class Eigen::Matrix<float,4,1,0,4,1> &,class Eigen::Quaternion<float,0> &,int &,int)" (?read@PCDReader@pcl@@UAEHABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AAUPointCloud2@sensor_msgs@@AAV?$Matrix@M$03$00$0A@$03$00@Eigen@@AAV?$Quaternion@M$0A@@8@AAHH@Z) 1>main.obj : error LNK2019: 无法解析的外部符号 "void __cdecl pcl::console::print(enum pcl::console::VERBOSITY_LEVEL,char const *,...)" (?print@console@pcl@@YAXW4VERBOSITY_LEVEL@12@PBDZZ),该符号在函数 "public: void __thiscall pcl::detail::FieldMapper<struct pcl::PointXYZRGB>::operator()<struct pcl::fields::x>(void)" (??$?RUx@fields@pcl@@@?$FieldMapper@UPointXYZRGB@pcl@@@detail@pcl@@QAEXXZ) 中被引用 1>G:\C++\icp\Debug\icp.exe : fatal error LNK1120: 4 个无法解析的外部命令 1> 1>生成失败。 1> 1>已用时间 00:00:12.70 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
c++读取txt文件里的数据,然后保存在二维数组中进行处理
我写的程序是把数据自己输入在主函数里,但是如果想实际的应用应该是有一个数据文件,然后提取出数据文件的数据保存在二维数组中才对,而且这个二维数组要根据具体文件的大小定数组的行列数,有谁能帮我做一下吗,谢谢! #include<iostream> #include<fstream> #include<math.h> using namespace std; #define M 10//二维数组的行 #define N 6//二维数组的列 class Data { double a[M][N];//声明数组 double Max; double Min; double r; public: Data(double b[M][N])//构造函数 { int i, j; for (i = 0; i < M; i++) for (j = 0; j < N; j++) a[i][j] = b[i][j]; } void Chuzhi();//初值化 void get_Max_Min();//根据公式求出求差序列的两级最大差、最小差 void get_r();//求出各列关联度 void show_Max_Min() { cout << "求差序列的两级的最大差是:" << Max << endl << endl; cout<<"求差序列的两级的最小差是:"<< Min << endl<<endl; } void show()//输出数组 { int i, j; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) cout << a[i][j] << '\t'; cout << endl; } } }; void Data::Chuzhi()//量纲不同时化为无量纲 { for (int i = M - 1; i >= 0; i--) for (int j = N - 1; j >= 0; j--) a[i][j] = a[i][j] / a[0][j]; } void Data::get_Max_Min() { double c[M][N - 1]; double t = c[0][0]; for (int i = 0; i < M; i++) for (int j = 1; j < N; j++) c[i][j - 1] = fabs(a[i][0] - a[i][j]);//求差序列 //下面的代码可用于输出求差序列 cout << endl; cout << "求差序列为:" << endl; int i, j; for (i = 0; i < M; i++) { for (j = 0; j < N - 1; j++) cout << c[i][j] << '\t'; cout << endl; } for (int i = 0; i < M; i++) { for (int j = 0; j < N - 1; j++) { if (c[i][j]>t) t = c[i][j]; } } Max = t; for (int i = 0; i < M; i++) { for (int j = 0; j < N - 1; j++) { if (c[i][j] < t) t = c[i][j]; } } Min = t; } void Data::get_r() { double f[M][N]; for (int j = 0; j < N; j++) for (int i = 0; i < M;i++) f[i][j] = (Min + 0.5*Max) / (fabs(a[i][0] - a[i][j]) + 0.5*Max); for (int i = 0; i < M; i++)//输出关联系数序列 { for (int j = 0; j < N; j++) cout << f[i][j] << '\t'; cout << endl; } cout << "下面求出各列的关联度:" << endl<<endl; double r[N] = { 0 }; double sum[M] = { 0 }; for (int j = 0; j < N; j++) { for (int i = 0; i < M; i++) sum[j] += f[i][j]; } for (int j = 0; j < N; j++) { r[j] = sum[j] / M; cout << "第" << j + 1 << "列与第一列的关联度为:" << r[j] << endl << endl; } } int main() {//将要处理的数据 double b[M][N] = { { 44,5, 35, 60, 110, 130}, { 45,6, 40, 67, 120, 140}, {54, 7, 50, 72, 122, 150}, { 49,8, 50, 80, 124, 160}, { 43,9, 60, 79, 121, 170}, {54, 20, 60, 90, 122, 156}, { 39,13, 40, 70, 111, 157}, { 37,27, 65, 83, 130, 189}, { 43,35, 80, 72, 145, 165}, { 34,67, 70, 69, 123, 157} }; Data data(b);//建立对象data cout << "最初的数据为:" << endl; data.show(); cout << endl; data.Chuzhi(); cout << "初始化后数据:" << endl; data.show(); cout << endl; data.get_Max_Min(); data.show_Max_Min(); data.get_r(); system("pause"); return 0; }
在CSV文件中,怎样将第一个文件的数据写入第一列,将第二个文件的数据写入第二列?
![图片说明](https://img-ask.csdn.net/upload/201608/09/1470722627_895105.jpg) 如图所示,在excel文件中,我想把第一个txt的数据写入excel的第一列,把第二个txt的数据写入excel的第二列中?现在我只能把两个txt文件的数据全部放在一列中,如何修改才能达到目的呢?码代如下: ``` #include <iostream> #include <fstream> #include <vector> #include <windows.h> #include <string> using namespace std; char* WcharToChar(const wchar_t* wp) { char *m_char; int len= WideCharToMultiByte(CP_ACP,0,wp,wcslen(wp),NULL,0,NULL,NULL); m_char=new char[len+1]; WideCharToMultiByte(CP_ACP,0,wp,wcslen(wp),m_char,len,NULL,NULL); m_char[len]='\0'; return m_char; } wchar_t* CharToWchar(const char* c) { wchar_t *m_wchar; int len = MultiByteToWideChar(CP_ACP,0,c,strlen(c),NULL,0); m_wchar=new wchar_t[len+1]; MultiByteToWideChar(CP_ACP,0,c,strlen(c),m_wchar,len); m_wchar[len]='\0'; return m_wchar; } wchar_t* StringToWchar(const string& s) { const char* p=s.c_str(); return CharToWchar(p); } int main() { const string fileform = "*.txt"; const string perfileReadPath = "Data"; const int perclass_sample = 20; string fileReadPath; int nLine = 0; string buf; vector<float> descriptors; int j = 0; ofstream file("data_file.csv"); fileReadPath = perfileReadPath + "/" + fileform; HANDLE hFile; LPCTSTR lpFileName = StringToWchar(fileReadPath); WIN32_FIND_DATA pNextInfo; hFile = FindFirstFile(lpFileName, &pNextInfo); if(hFile == INVALID_HANDLE_VALUE) { exit(-1); } do { if(pNextInfo.cFileName[0] == '.') continue; j++; printf("%s\n",WcharToChar(pNextInfo.cFileName)); ifstream src_data(perfileReadPath + "/" + WcharToChar(pNextInfo.cFileName)); while( src_data ) { if( getline( src_data, buf ) ) { nLine++; descriptors.push_back( atof(buf.c_str()) ); } } src_data.close(); for(int i=0; i<descriptors.size();i++) { file<<descriptors[i]<<endl; } //格式化容器,清除容器内所有数据,为保存下一个txt文件数据文件做准备 descriptors.clear(); } while (FindNextFile(hFile,&pNextInfo) && j<perclass_sample); return 0; } ```
求解c++爬虫,这个代码为何老是(hash_set)错误?
老是编译错误好难呀,越改越错只好让大佬们帮忙看看了!用的是vs2019 报错 ``` E0035 #error 指令: <hash_set> is deprecated and will be REMOVED. Please use <unordered_set>. You can define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS to acknowledge that you have received this warning. c爬虫 C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.24.28314\include\hash_set 21 错误 C1189 #error: <hash_set> is deprecated and will be REMOVED. Please use <unordered_set>. You can define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS to acknowledge that you have received this warning. c爬虫 C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.24.28314\include\hash_set 22 ``` 设计爬虫程序并将爬取到内容存放在文件中。 要求: 1. 可将指定URL及其级联的三级网页下面的所有URL及相应内容找出来。 2. 以BFS或者DFS策略搜索级联页面,设计相应的数据结构与文件,将URL与页面内容(文本形式)保存。 3. 提供简单的搜索引擎功能(给定字符串,如果在级联的三级网页下面下存在,则返回相应的URL) ``` #include <string> #include <iostream> #include <fstream> #include <vector> #include "winsock2.h" #include <time.h> #include <queue> #include <hash_set> #pragma comment(lib, "ws2_32.lib") using namespace std; #define DEFAULT_PAGE_BUF_SIZE 1048576 queue<string> hrefUrl; hash_set<string> visitedUrl; hash_set<string> visitedImg; int g_ImgCnt = 1;//图片编号 bool ParseURL(const string& url, string& host, string& resource) {//解析URL,解析出主机名,资源名 if (strlen(url.c_str()) > 2000) { return false; } const char* pos = strstr(url.c_str(), "http://"); if (pos == NULL) pos = url.c_str(); else pos += strlen("http://"); char pHost[100]; char pResource[2000]; if (strstr(pos, "/") == 0) { pResource[0] = '/'; pResource[1] = 0; strcpy(pHost, pos); } else sscanf(pos, "%[^/]%s", pHost, pResource); host = pHost; resource = pResource; return true; } //使用Get请求,得到响应 bool GetHttpResponse(const string& url, char*& response, int& bytesRead) { string host, resource; if (!ParseURL(url, host, resource)) { cout << "获取get请求失败" << endl; return false; } //建立socket struct hostent* hp = gethostbyname(host.c_str()); if (hp == NULL) { cout << " host 地址错误" << endl; return false; } SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == -1 || sock == -2) { cout << " sock创建失败" << endl; return false; } //建立服务器地址 SOCKADDR_IN sa; sa.sin_family = AF_INET; sa.sin_port = htons(80); memcpy(&sa.sin_addr, hp->h_addr, 4); //建立连接 if (0 != connect(sock, (SOCKADDR*)&sa, sizeof(sa))) { cout << "不能连接: " << url << endl; closesocket(sock); return false; }; //准备发送数据 string request = "GET " + resource + " HTTP/1.1\r\nHost:" + host + "\r\nConnection:Close\r\n\r\n";//字符串拼接 //发送数据 if (SOCKET_ERROR == send(sock, request.c_str(), request.size(), 0)) {//request.size()=strlen(request.c_str) cout << "send error" << endl; closesocket(sock); return false; } //接收数据 int m_nContentLength = DEFAULT_PAGE_BUF_SIZE; char* pageBuf = (char*)malloc(m_nContentLength); memset(pageBuf, 0, m_nContentLength); bytesRead = 0; int ret = 1; while (ret > 0) { ret = recv(sock, pageBuf + bytesRead, m_nContentLength - bytesRead, 0); if (ret > 0){ bytesRead += ret; } if (m_nContentLength - bytesRead < 100){ m_nContentLength *= 2; pageBuf = (char*)realloc(pageBuf, m_nContentLength); } cout << ret << " "; } cout << endl; pageBuf[bytesRead] = '\0'; response = pageBuf; closesocket(sock); return true; } //提取所有的URL以及图片URL void HTMLParse(string& htmlResponse, vector<string>& imgurls, const string& host) { const char* p = htmlResponse.c_str(); const char* tag = "href=\"";//href的内容 就是指要跳转的路由 或 方法 const char* pos = strstr(p, tag); ofstream ofile("url.txt", ios::app);//以追加的方式打开文件 while (pos){ pos += strlen(tag); const char* nextQ = strstr(pos, "\""); if (nextQ){ char* url = new char[nextQ - pos + 1]; sscanf(pos, "%[^\"]", url); string surl = url; // 转换成string类型,可以自动释放内存 if (visitedUrl.find(surl) == visitedUrl.end()) {// visitedUrl.find( surl )=visitedUrl.end() 表示visitedUrl中没有sur1 visitedUrl.insert(surl); ofile << surl << endl; hrefUrl.push(surl);//将sur1插到队列末 } pos = strstr(pos, tag); delete[] url; } } ofile << endl << endl; ofile.close(); tag = "<img "; const char* att1 = "src=\"";//规定图像的 URL。 const char* att2 = "lazy_src=\""; const char* pos0 = strstr(p, tag); while (pos0){ pos0 += strlen(tag); const char* pos2 = strstr(pos0, att2); if (!pos2 || pos2 > strstr(pos0, ">")){ pos = strstr(pos0, att1);//非延迟加载项 if (!pos) { pos0 = strstr(att1, tag); continue; } else { pos = pos + strlen(att1); } }else { pos = pos2 + strlen(att2); } const char* nextQ = strstr(pos, "\""); if (nextQ){ char* url = new char[nextQ - pos + 1]; sscanf(pos, "%[^\"]", url); cout << url << endl; string imgUrl = url; if (visitedImg.find(imgUrl) == visitedImg.end()) { visitedImg.insert(imgUrl); imgurls.push_back(imgUrl);//imgurls作为模板队列,push_back的参数由单个字符变成string类型 } pos0 = strstr(pos0, tag); delete[] url; } } cout << "网页请求成功!" << endl; } //把URL转化为文件名 string ToFileName(const string& url) { string fileName; fileName.resize(url.size()); int k = 0; for (int i = 0; i < (int)url.size(); i++) { char ch = url[i]; if (ch != '\\' && ch != '/' && ch != ':' && ch != '*' && ch != '?' && ch != '"' && ch != '<' && ch != '>' && ch != '|') fileName[k++] = ch; } return fileName.substr(0, k) + ".txt";//从第0位开始,长度为k的字符串 + .txt } //下载图片到img文件夹 void DownLoadImg(vector<string>& imgurls, const string& url) { //生成保存该url下图片的文件夹 string foldname = ToFileName(url); foldname = "./img/" + foldname; if (!CreateDirectoryA(foldname.c_str(), NULL)) cout << "不能创建文件:" << foldname << endl; char* image; int byteRead; for (int i = 0; i < imgurls.size(); i++) { //判断是否为图片 string str = imgurls[i]; int pos = str.find_last_of("."); if (pos == string::npos) continue; else { string ext = str.substr(pos + 1, str.size() - pos - 1); if (ext != "bmp" && ext != "jpg" && ext != "jpeg" && ext != "gif" && ext != "png") continue; } //下载其中的内容 if (GetHttpResponse(imgurls[i], image, byteRead)) { if (strlen(image) == 0) { continue; } const char* p = image; const char* pos = strstr(p, "\r\n\r\n") + strlen("\r\n\r\n"); int index = imgurls[i].find_last_of("/"); if (index != string::npos) { string imgname = imgurls[i].substr(index, imgurls[i].size()); ofstream ofile(foldname + imgname, ios::binary); if (!ofile.is_open()) continue; cout << g_ImgCnt++ << foldname + imgname << endl; ofile.write(pos, byteRead - (pos - p)); ofile.close(); } free(image); } } } //广度遍历 void BFS(const string& url) { char* response; int bytes; // 获取网页的相应,放入response中。 if (!GetHttpResponse(url, response, bytes)) { cout << "网页获取错误!." << endl; return; } string httpResponse = response; free(response); string filename = ToFileName(url); ofstream ofile("./html/" + filename); if (ofile.is_open()) { ofile << httpResponse << endl; // 保存该网页的文本内容 ofile.close(); } vector<string> imgurls; HTMLParse(httpResponse, imgurls, url);//解析该网页的所有图片链接,放入imgurls里面 DownLoadImg(imgurls, url); } //文件内容搜索 void Fstring(string& urlar) { int i = 0; cout << "请输入需要查找的字符串"; string defo, urltxt; cin >> defo; ifstream ifile; do { if (urlar[i] == NULL) { cout << "没有找到所要内容"; ifile.close(); return; } ifstream ifile("./html/" + urlar[i++]); ifile >> urltxt; } while (urltxt.find(defo) == string::npos);//字符串对比 cout << "搜索内容位于:" << urlar[i - 1]; ifile.close(); } int main(){ //初始化socket,用于tcp网络连接 WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { return 0; } // 创建文件夹,保存图片和网页文本文件 CreateDirectoryA("./img", 0); CreateDirectoryA("./html", 0); string urlStart = "http://hao.360.cn/meinvdaohang.html"; //cout << "请输入url"; //cin >> urlStart; BFS(urlStart); string urlar[2000]; int i = 0; // 访问过的网址保存起来 visitedUrl.insert(urlStart); while (hrefUrl.size() != 0) { string url = hrefUrl.front(); // 从队列的最开始取出一个网址 cout << url << endl; BFS(url); // 遍历提取出来的那个网页,找它里面的超链接网页放入hrefUrl,下载它里面的文本,图片 urlar[i++] = ToFileName(url); hrefUrl.pop(); // 遍历完之后,删除这个网址 } int p; cout << "是否需要查找内容?(1,查找,2退出):"; cin >> p; if (p == 1) Fstring(*urlar); WSACleanup();//解除socket return 0; } #include <string> #include <iostream> #include <fstream> #include <vector> #include "winsock2.h" #include <time.h> #include <queue> #include <hash_set> #pragma comment(lib, "ws2_32.lib") using namespace std; #define DEFAULT_PAGE_BUF_SIZE 1048576 queue<string> hrefUrl; hash_set<string> visitedUrl; hash_set<string> visitedImg; int g_ImgCnt = 1;//图片编号 bool ParseURL(const string& url, string& host, string& resource) {//解析URL,解析出主机名,资源名 if (strlen(url.c_str()) > 2000) { return false; } const char* pos = strstr(url.c_str(), "http://"); if (pos == NULL) pos = url.c_str(); else pos += strlen("http://"); char pHost[100]; char pResource[2000]; if (strstr(pos, "/") == 0) { pResource[0] = '/'; pResource[1] = 0; strcpy(pHost, pos); } else sscanf(pos, "%[^/]%s", pHost, pResource); host = pHost; resource = pResource; return true; } //使用Get请求,得到响应 bool GetHttpResponse(const string& url, char*& response, int& bytesRead) { string host, resource; if (!ParseURL(url, host, resource)) { cout << "获取get请求失败" << endl; return false; } //建立socket struct hostent* hp = gethostbyname(host.c_str()); if (hp == NULL) { cout << " host 地址错误" << endl; return false; } SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == -1 || sock == -2) { cout << " sock创建失败" << endl; return false; } //建立服务器地址 SOCKADDR_IN sa; sa.sin_family = AF_INET; sa.sin_port = htons(80); memcpy(&sa.sin_addr, hp->h_addr, 4); //建立连接 if (0 != connect(sock, (SOCKADDR*)&sa, sizeof(sa))) { cout << "不能连接: " << url << endl; closesocket(sock); return false; }; //准备发送数据 string request = "GET " + resource + " HTTP/1.1\r\nHost:" + host + "\r\nConnection:Close\r\n\r\n";//字符串拼接 //发送数据 if (SOCKET_ERROR == send(sock, request.c_str(), request.size(), 0)) {//request.size()=strlen(request.c_str) cout << "send error" << endl; closesocket(sock); return false; } //接收数据 int m_nContentLength = DEFAULT_PAGE_BUF_SIZE; char* pageBuf = (char*)malloc(m_nContentLength); memset(pageBuf, 0, m_nContentLength); bytesRead = 0; int ret = 1; while (ret > 0) { ret = recv(sock, pageBuf + bytesRead, m_nContentLength - bytesRead, 0); if (ret > 0){ bytesRead += ret; } if (m_nContentLength - bytesRead < 100){ m_nContentLength *= 2; pageBuf = (char*)realloc(pageBuf, m_nContentLength); } cout << ret << " "; } cout << endl; pageBuf[bytesRead] = '\0'; response = pageBuf; closesocket(sock); return true; } //提取所有的URL以及图片URL void HTMLParse(string& htmlResponse, vector<string>& imgurls, const string& host) { const char* p = htmlResponse.c_str(); const char* tag = "href=\"";//href的内容 就是指要跳转的路由 或 方法 const char* pos = strstr(p, tag); ofstream ofile("url.txt", ios::app);//以追加的方式打开文件 while (pos){ pos += strlen(tag); const char* nextQ = strstr(pos, "\""); if (nextQ){ char* url = new char[nextQ - pos + 1]; sscanf(pos, "%[^\"]", url); string surl = url; // 转换成string类型,可以自动释放内存 if (visitedUrl.find(surl) == visitedUrl.end()) {// visitedUrl.find( surl )=visitedUrl.end() 表示visitedUrl中没有sur1 visitedUrl.insert(surl); ofile << surl << endl; hrefUrl.push(surl);//将sur1插到队列末 } pos = strstr(pos, tag); delete[] url; } } ofile << endl << endl; ofile.close(); tag = "<img "; const char* att1 = "src=\"";//规定图像的 URL。 const char* att2 = "lazy_src=\""; const char* pos0 = strstr(p, tag); while (pos0){ pos0 += strlen(tag); const char* pos2 = strstr(pos0, att2); if (!pos2 || pos2 > strstr(pos0, ">")){ pos = strstr(pos0, att1);//非延迟加载项 if (!pos) { pos0 = strstr(att1, tag); continue; } else { pos = pos + strlen(att1); } }else { pos = pos2 + strlen(att2); } const char* nextQ = strstr(pos, "\""); if (nextQ){ char* url = new char[nextQ - pos + 1]; sscanf(pos, "%[^\"]", url); cout << url << endl; string imgUrl = url; if (visitedImg.find(imgUrl) == visitedImg.end()) { visitedImg.insert(imgUrl); imgurls.push_back(imgUrl);//imgurls作为模板队列,push_back的参数由单个字符变成string类型 } pos0 = strstr(pos0, tag); delete[] url; } } cout << "网页请求成功!" << endl; } //把URL转化为文件名 string ToFileName(const string& url) { string fileName; fileName.resize(url.size()); int k = 0; for (int i = 0; i < (int)url.size(); i++) { char ch = url[i]; if (ch != '\\' && ch != '/' && ch != ':' && ch != '*' && ch != '?' && ch != '"' && ch != '<' && ch != '>' && ch != '|') fileName[k++] = ch; } return fileName.substr(0, k) + ".txt";//从第0位开始,长度为k的字符串 + .txt } //下载图片到img文件夹 void DownLoadImg(vector<string>& imgurls, const string& url) { //生成保存该url下图片的文件夹 string foldname = ToFileName(url); foldname = "./img/" + foldname; if (!CreateDirectoryA(foldname.c_str(), NULL)) cout << "不能创建文件:" << foldname << endl; char* image; int byteRead; for (int i = 0; i < imgurls.size(); i++) { //判断是否为图片 string str = imgurls[i]; int pos = str.find_last_of("."); if (pos == string::npos) continue; else { string ext = str.substr(pos + 1, str.size() - pos - 1); if (ext != "bmp" && ext != "jpg" && ext != "jpeg" && ext != "gif" && ext != "png") continue; } //下载其中的内容 if (GetHttpResponse(imgurls[i], image, byteRead)) { if (strlen(image) == 0) { continue; } const char* p = image; const char* pos = strstr(p, "\r\n\r\n") + strlen("\r\n\r\n"); int index = imgurls[i].find_last_of("/"); if (index != string::npos) { string imgname = imgurls[i].substr(index, imgurls[i].size()); ofstream ofile(foldname + imgname, ios::binary); if (!ofile.is_open()) continue; cout << g_ImgCnt++ << foldname + imgname << endl; ofile.write(pos, byteRead - (pos - p)); ofile.close(); } free(image); } } } //广度遍历 void BFS(const string& url) { char* response; int bytes; // 获取网页的相应,放入response中。 if (!GetHttpResponse(url, response, bytes)) { cout << "网页获取错误!." << endl; return; } string httpResponse = response; free(response); string filename = ToFileName(url); ofstream ofile("./html/" + filename); if (ofile.is_open()) { ofile << httpResponse << endl; // 保存该网页的文本内容 ofile.close(); } vector<string> imgurls; HTMLParse(httpResponse, imgurls, url);//解析该网页的所有图片链接,放入imgurls里面 DownLoadImg(imgurls, url); } //文件内容搜索 void Fstring(string& urlar) { int i = 0; cout << "请输入需要查找的字符串"; string defo, urltxt; cin >> defo; ifstream ifile; do { if (urlar[i] == NULL) { cout << "没有找到所要内容"; ifile.close(); return; } ifstream ifile("./html/" + urlar[i++]); ifile >> urltxt; } while (urltxt.find(defo) == string::npos);//字符串对比 cout << "搜索内容位于:" << urlar[i - 1]; ifile.close(); } int main(){ //初始化socket,用于tcp网络连接 WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { return 0; } // 创建文件夹,保存图片和网页文本文件 CreateDirectoryA("./img", 0); CreateDirectoryA("./html", 0); string urlStart = "http://hao.360.cn/meinvdaohang.html"; //cout << "请输入url"; //cin >> urlStart; BFS(urlStart); string urlar[2000]; int i = 0; // 访问过的网址保存起来 visitedUrl.insert(urlStart); while (hrefUrl.size() != 0) { string url = hrefUrl.front(); // 从队列的最开始取出一个网址 cout << url << endl; BFS(url); // 遍历提取出来的那个网页,找它里面的超链接网页放入hrefUrl,下载它里面的文本,图片 urlar[i++] = ToFileName(url); hrefUrl.pop(); // 遍历完之后,删除这个网址 } int p; cout << "是否需要查找内容?(1,查找,2退出):"; cin >> p; if (p == 1) Fstring(*urlar); WSACleanup();//解除socket return 0; } ```
小女子初学编程,遇到的问题不少,希望各位大神耐心指教。。非常感谢!
题目:声明字符型静态数据成员ServerName,保存其服务器名称;声明整型静态数据成员ClientNum,记录已定义的客户数量;定义静态函数ChangeServerName()改变服务器名称.在头文件client.h中声明类,在文件clent.cpp中实现,在文件test.cpp中测试这个类,观察相应的成员 下面是我写的程序: #include<iostream> using namespace std; class CLIENT { public: CLIENT(char name,int num) { ServerName=name; ClientNum=num; } CLIENT(CLIENT &p); ~CLIENT() {} void showServerName() {} void showClientNum() {} void showChangeServerName(); private: static char ServerName; static int ClientNum; }; #include"client.h" CLIENT::ServerName(char name) { ServerName=name; } CLIENT::ClientNum(int num) { ClientNum=num; } char ServerName='I'; int ClientNum=0; #include<iostream.h> #include"text.h" int main() { CLIENT n(7,'W'); cout<<"已定义客户数量:"<<n.showClientNum()<<endl; n.showClientNum(); cout<<"服务器名称改为:"<<n.showChangeServerName()<<endl; n.showChangeServerName(); }
程序运行后txt文本出现乱
程序运行后文本文件出现乱码,四个warning是相同的问题, 看了很多帖子但都没有相关的详细回答 请问这种情况该如何解决 ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576134842_865518.png) ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576134945_774123.png) ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576135365_278865.png) ``` #include<iostream> #include<string.h> #include<iomanip> #include<fstream> #include<stdio.h> #include <stdlib.h> using namespace std; int count=0; class CData //定义数据基类 { public: CData(){}; virtual int Compare(CData &)=0; virtual void Show()=0; virtual ~CData(){}; }; class CNode //定义结点基类 { private: CData *pData; //用于指向数据类的指针 CNode *pNext; //用于指向链表的后向指针 public: void InputData(CData *pdata){pData=pdata;} //输入数据 void ShowNode(){pData->Show();} //打印一个节点的数据 CData *GetData(){return pData;} friend class CList; //定义链表类为基类 }; class CList { CNode *pHead; //链表头结点指针 public: CList(){pHead=0;}; ~CList(){DeleteList();} void AddNode(CNode *pnode); //在首部添加结点 CNode *DeleteNode(CNode *); //删除一个指定的结点,返回该结点的指针 CNode *Search(CData &); //查找一个指定的数据,返回该数据所在的结点在链表的指针,未找到返回0 bool IsExist(CData &); void ShowList(); //打印整个链表 void DeleteList(); //删除整个链表 CNode *GetListHead(){return pHead;} //返回链表首结点 CNode *GetListNextNode(CNode *pnode); //返回链表指定结点的下一个结点 }; CNode *CList::GetListNextNode(CNode *pnode) //返回链表指定结点的下一个结点 { CNode *p1=pnode; return p1->pNext; }; void CList::AddNode(CNode *pnode) //在首部添加结点 { if (pHead==0) //如果是空链表,插入的结点是唯一的结点 { pHead=pnode; pnode->pNext=0; return; } else //否则,插入到链表首部 { pnode->pNext=pHead; pHead=pnode; } }; CNode *CList::DeleteNode(CNode *pnode) //删除一个指定的结点,返回该结点的指针 { CNode *p1,*p2; p1=pHead; //指向首结点 while(p1!=pnode&&p1->pNext!=0) //寻找要删除的结点 { p2=p1; p1=p1->pNext; //结点p2始终在p1的后面 } if (p1==pHead) //如果要删除的是首结点 { pHead=pHead->pNext; //将首结点后移 return pnode; } p2->pNext=p1->pNext; //p1指向被删除的结点,将p2结点与p1后面的结点连接起来 return pnode; } CNode *CList::Search(CData &data) //查找一个指定的数据,返回指针,若未找到返回0 { CNode *p1=pHead; while(p1) //从头结点开始查找 { if (p1->pData->Compare(data)==0) return p1; //找到后返回结点指针 p1=p1->pNext; } return 0; //搜索完找不到,返回空指针0 } void CList::ShowList() //打印整个链表 { CNode *p1=pHead; while(p1) { p1->pData->Show(); p1=p1->pNext; } } void CList::DeleteList() //删除整个链表结点 { CNode *p1,*p2; p1=pHead; while(p1) { delete p1->pData; p2=p1; p1=p1->pNext; delete p2; } } class Repository:public CData //库存为记录,为数据基类的公有派生类 { private : char szName[20]; //库存中数据:商品名、商品数量和入库价格 unsigned int szNumber; char szPrice[20]; char szN; CList ShList; public: Repository(); //构造函数 Repository(char *name,int number,char *price); void SetRecord(char *name, int number,char *price); //输入数据函数 int Compare(CData &); //比较函数,比较商品名 void Show(); void AddRecord(); void Display(); void LookUpRecord(); void DeleteRecord(); void ModifyRecord(); void SaveToFile(); void Operate(string &strChoice); void ReadFromFile(); void Output(); }; Repository::Repository() { strcpy(szName,"\0"); szNumber=0; strcpy(szPrice,"\0"); } Repository::Repository(char *name,int number,char *price) { strcpy(szName,name); szNumber=number; strcpy(szPrice,price); szN=name[0]; } void Repository::SetRecord(char *name, int number,char *price) //输入数据函数 { strcpy(szName,name); szNumber=number; strcpy(szPrice,price); szN=name[0]; } int Repository::Compare(CData &data) //比较商品名 { Repository &temp=(Repository &)data; return strcmp(szName,temp.szName); } void Repository::Show() //打印一个结点的数据 { cout<<setw(15)<<szName<<setw(15)<<szNumber<<setw(15)<<szPrice<<endl; } void Repository::AddRecord() //将记录添加到链表中 { CNode *pNode; Repository *pSh; char szName[20],szPrice[20]; unsigned int szNumber; cout<<"请输入新商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { cout<<"请输入新商品入库价格: "; cin>>szPrice; cout<<"请输入新商品数量: "; cin>>szNumber; pSh=new Repository; //生成新的数据累对象 pSh->SetRecord(szName,szNumber,szPrice); //数据类对象赋值 pNode=new CNode; //生成新的结点 pNode->InputData(pSh); //结点插入链表 ShList.AddNode(pNode); count++; cout<<"请输入新商品名(输入0退出,并进入系统菜单) "; cin>>szName; } cout<<endl<<endl; } void Repository::Display() //显示全部链表数据 { cout<<"当前操作共有"<<count<<"条新商品的添加纪录。\n\n"; cout<<"目前库存共有商品信息记录是:\n\n"; cout<<setiosflags(ios_base::left)<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl<<endl; ShList.ShowList(); cout<<endl<<endl; system("pause"); system("cls"); } void Repository::LookUpRecord() // 按照商品名查找 { CNode *pLook; char szName[20]; cout<<"请输入您需要查找的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while (strcmp(szName,"0")) { Repository sh(szName,0,"0"); //生成结点 pLook=ShList.Search(sh); //查找指定结点的数据 if (pLook) { cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); } else cout<<"在库存商品信息记录中找不到商品:"<<szName<<"。"<<endl; cout<<"请输入您需要查找的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } cout<<endl<<endl; } void Repository::DeleteRecord() //在链表中删除指定的结点的数据 { CNode *pLook; char szName[20]; cout<<"请输入您需要删除的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { Repository sh(szName,0,"0"); pLook=ShList.Search(sh); if (pLook) //删除时应先查找出结点 { cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); cout<<"请确定是否删除此商品信息记录(Y/N)【确定删除请输入Y或y,取消删除请输入N或n】:"; char ok; cin>>ok; if (ok=='Y'||ok=='y') { ShList.DeleteNode(pLook); cout<<szName<<"的信息记录删除成功!"<<endl; delete pLook; count--; } else if(ok=='N'||ok=='n') cout<<szName<<"的信息记录删除失败!"<<endl; } else cout<<"在库存商品信息记录中找不到商品:"<<szName<<"。"<<endl; cout<<"请输入您需要删除的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } cout<<endl<<endl; } void Repository::ModifyRecord() //修改商品记录 { CNode *pLook; Repository *pSh; char szName[20],szPrice[20]; unsigned int szNumber; cout<<"请输入您需要修改的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { Repository sh(szName,0,"0"); pLook=ShList.Search(sh); if (pLook) //修改时应先查找出结点 { cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); cout<<"-----下面开始修改-----"<<endl<<"请输入修改后的商品名: "; cin>>szName; cout<<"请输入修改后的商品数量:"; cin>>szNumber; cout<<"请输入修改后的商品入库价格: "; cin>>szPrice; cout<<"请确定是否修改此记录(Yes (Y) or No(N)):"; char ok; cin>>ok; if (ok=='Y'||ok=='y') { pSh=new Repository; pSh->SetRecord(szName,szNumber,szPrice); pLook->InputData(pSh); cout<<szName<<"的信息记录修改成功!"<<endl; } else if(ok=='N'||ok=='n') cout<<szName<<"的信息记录修改失败!"<<endl; } else cout<<" 在库存商品信息记录中找不到"<<szName<<","<<endl; cout<<" 请输入您需要修改的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } } void Repository::Output() { CNode *pLook; Repository *pSh; char szName[20]; unsigned int szNumber; cout<<"请输入您需要出库的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { Repository sh(szName,0,"0"); pLook=ShList.Search(sh); if (pLook) //修改时应先查找出结点 { pSh=(Repository *)pLook->GetData(); cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); if (0==pSh->szNumber) { cout<<"该商品缺货,请及时补充!"<<endl; } else { cout<<"请输入您要取出的商品数量:"; cin>>szNumber; cout<<"请确定是否取出该商品( Yes (Y) or No(N) ):"; char ok; cin>>ok; if(ok=='Y'||ok=='y') { if(pSh->szNumber<=szNumber) { cout<<szName<<"您要求的商品数量大于仓库中的数量,故全部输出"<<pSh->szNumber<<" 个商品"<<endl; pSh->szNumber=0; } else { pSh->szNumber-=szNumber; cout<<szName<<"您已取出 "<<szNumber<<" 个商品"<<endl; } cout<<szName<<"成功取出!"<<endl; } else if(ok=='N'||ok=='n') cout<<szName<<"您取消了该操作"<<endl; } } else cout<<" 在库存商品信息记录中找不到"<<szName<<","<<endl; cout<<" 请输入您需要出库的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } } void Repository::SaveToFile() //将链表中的数据保存在文件中 { ofstream outfile("repository.txt",ios::binary); if(! outfile) { cout<<"数据文件打开错误,没有将数据存入文件!\n"; return; } CNode *pnode; Repository *pSh; string strName,strNumber; pnode=ShList.GetListHead(); //取出链表首结点指针 while(pnode) { pSh=(Repository *)pnode->GetData(); //返回结点指向的数据域指针 outfile.write((char *)pSh,sizeof(Repository)); //将数据域写入文件 pnode=ShList.GetListNextNode(pnode); // 取下一结点的指针 } outfile.close(); } void Repository::ReadFromFile() //在程序开始先查找有无数据文件,找到后读取文件数据 { ifstream infile("repository.txt",ios::binary); if(! infile) { cout<<"没有数据文件,请您先添加!\n\n"; return; } CNode *pNode; Repository *pSh; while(! infile.eof()) { pSh=new Repository; //定义数据域对象 infile.read((char *)pSh,sizeof(Repository)); pNode=new CNode; pNode->InputData(pSh); //数据域对象内容生成结点 ShList.AddNode(pNode); //将结点加入链表 } ShList.DeleteNode(pNode); //由于文件多读一次,所以将首结点删除 infile.close(); } void Repository::Operate(string &strChoice) //根据主菜单选项进行操作 { if (strChoice=="1") AddRecord(); else if (strChoice=="2") Display(); else if (strChoice=="3") LookUpRecord(); else if (strChoice=="4") DeleteRecord(); else if(strChoice=="5") ModifyRecord(); else if(strChoice=="6") Output(); else if (strChoice=="0") SaveToFile(); else cout<<"对不起,您的输入有误,请重新输入您的选择: "; } int main() { Repository repository; cout<<"*******************************************************************\n\n"; cout<<" 欢迎进入库存管理系统 \n\n"; cout<<"*******************************************************************\n\n"; repository.ReadFromFile(); //从文件中输入数据 string strChoice; //接受主菜单选项 do { cout<<"【欢迎进入系统菜单】:\n\n\n"; cout<<" <1>.添加新商品信息记录\n\n"; cout<<" <2>.显示库存中商品信息记录内容\n\n"; cout<<" <3>.根据商品名查询库存中商品信息记录\n\n"; cout<<" <4>.根据商品名删除库存中商品信息记录\n\n"; cout<<" <5>.根据商品名修改库存中商品信息记录\n\n"; cout<<" <6>.商品出库\n\n"; cout<<" <0>.退出系统\n\n\n"; cout<<"【请输入您的选择】:"; cin>>strChoice; system("cls"); repository.Operate(strChoice); }while(strChoice!="0"); cout<<"***********************************************************************\n\n"; cout<<" ------------******欢迎再次使用库存管理系统******---------- \n\n"; cout<<"***********************************************************************\n\n"; system("pause"); } ```
关于WindowsC++的录音保存为wav格式的音频文件的问题?
我的这个程序是:启动程序进行录音,录音结束,将录音保存为wav格式的文件。 问题是:我保存的这个wav音频文件有问题,打开后没有我录的声音。 以下是我的源代码: #include "stdafx.h" #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <mmsystem.h> #include <iostream> #include <fstream> #include <string> #include <stdlib.h> using namespace std; #pragma comment(lib, "winmm.lib") #define BUFFER_SIZE (44100*16*2/8*5) // 录制声音长度 ,5是指5秒 #define FRAGMENT_SIZE 1024 // 缓存区大小 #define FRAGMENT_NUM 4 // 缓存区个数 static unsigned char buffer[BUFFER_SIZE] = {0}; static int buf_count = 0; // 函数定义 void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2 ); /* wav音频头部格式 */ typedef struct _wave_pcm_hdr { char riff[4]; // = "RIFF" intsize_8; // = FileSize - 8 char wave[4]; // = "WAVE" char fmt[4]; // = "fmt " intfmt_size;// = 下一个结构体的大小 : 16 short int format_tag; // = PCM : 1 short int channels; // = 通道数 : 1 intsamples_per_sec; // = 采样率 : 8000 | 6000 | 11025 | 16000 intavg_bytes_per_sec; // = 每秒字节数 : samples_per_sec * bits_per_sample / 8 short int block_align; // = 每采样点字节数 : wBitsPerSample / 8 short int bits_per_sample; // = 量化比特数: 8 | 16 char data[4]; // = "data"; intdata_size; // = 纯数据长度 : FileSize - 44 } wave_pcm_hdr; /* 默认wav音频头部数据 */ wave_pcm_hdr default_wav_hdr = { { 'R', 'I', 'F', 'F' }, 0, {'W', 'A', 'V', 'E'}, {'f', 'm', 't', ' '}, 16, 1, 1, 16000, 32000, 2, 16, {'d', 'a', 't', 'a'}, 0 }; // 入口 int main() { /* 录音 */ // Device int nReturn = waveInGetNumDevs(); printf("输入设备数目:%d\n", nReturn); for (int i=0; i<nReturn; i++) { WAVEINCAPS wic; waveInGetDevCaps(i, &wic, sizeof(WAVEINCAPS)); printf("#%d\t设备名:%s\n", i, wic.szPname); } // open HWAVEIN hWaveIn; WAVEFORMATEX wavform; wavform.wFormatTag = WAVE_FORMAT_PCM; wavform.nChannels = 2; wavform.nSamplesPerSec = 44100; wavform.nAvgBytesPerSec = 44100*16*2/8; wavform.nBlockAlign = 4; wavform.wBitsPerSample = 16; wavform.cbSize = 0; waveInOpen(&hWaveIn, WAVE_MAPPER, &wavform, (DWORD_PTR)waveInProc, 0, CALLBACK_FUNCTION); WAVEINCAPS wic; waveInGetDevCaps((UINT_PTR)hWaveIn, &wic, sizeof(WAVEINCAPS)); printf("打开的输入设备:%s\n", wic.szPname); // prepare buffer static WAVEHDR wh[FRAGMENT_NUM]; for (int i=0; i<FRAGMENT_NUM; i++) { wh[i].lpData = new char[FRAGMENT_SIZE]; wh[i].dwBufferLength = FRAGMENT_SIZE; wh[i].dwBytesRecorded = 0; wh[i].dwUser = NULL; wh[i].dwFlags = 0; wh[i].dwLoops = 1; wh[i].lpNext = NULL; wh[i].reserved = 0; waveInPrepareHeader(hWaveIn, &wh[i], sizeof(WAVEHDR));//准备波形数据块头用于录音 waveInAddBuffer(hWaveIn, &wh[i], sizeof(WAVEHDR)); //指定波形数据块为录音输入缓存 } // record printf("Start to Record...\n"); buf_count = 0; waveInStart(hWaveIn); //启动输入 的waveInStart功能开始在给定的波形音频输入设备的输入。//开始录音 while (buf_count < BUFFER_SIZE) { Sleep(1); } printf("Record Over!\n\n"); //将录音保存为wav格式的文件 SYSTEMTIME systemtime; GetLocalTime(&systemtime); char filename[256]; sprintf_s(filename, 256, "%d-%d-%d_%d_%d_%d.wav", systemtime.wYear, systemtime.wMonth, systemtime.wDay, systemtime.wHour, systemtime.wMinute, systemtime.wSecond); //m_pWavFile = wav_write_open(filename, 8000, 16, 1); FILE * fp = fopen(filename, "wb"); wave_pcm_hdr wav_hdr = default_wav_hdr; fwrite(&wav_hdr, sizeof(wav_hdr), 1, fp);//头 fwrite(buffer, sizeof(buffer) ,1, fp);//数据 // clean waveInStop(hWaveIn); waveInReset(hWaveIn); for (int i=0; i<FRAGMENT_NUM; i++) { waveInUnprepareHeader(hWaveIn, &wh[i], sizeof(WAVEHDR)); delete wh[i].lpData; } waveInClose(hWaveIn); system("pause"); printf("\n"); return 0; } // 录音回调函数 void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2 ) { LPWAVEHDR pwh = (LPWAVEHDR)dwParam1; if ((WIM_DATA==uMsg) && (buf_count<BUFFER_SIZE)) { int temp = BUFFER_SIZE - buf_count; temp = (temp>pwh->dwBytesRecorded) ? pwh->dwBytesRecorded : temp; memcpy(buffer+buf_count, pwh->lpData, temp); buf_count += temp; waveInAddBuffer(hwi, pwh, sizeof(WAVEHDR)); } }
C++ 文件输入保存 问题
#include <iostream> #include<fstream> int main() { using namespace std ; cout << "Please Enter two integers : " << endl ; const int Arraysize = 2 ; int Array [ Arraysize ] ; for ( size_t size = 0 ; size != Arraysize ; ++ size ) { cin >> Array [size]; } const char* filename = "C:\\save_data.txt" ; FILE* FP = fopen( filename , "wb") ; if ( FP == NULL ) { cout << "failed to save data " << endl ; return -1 ; } fwrite (Array , 1 , 8 , FP ) ; fclose (FP) ; system("pause") ; } 为什么这段代码输入2个整型数据后,打开保存的文档,看到的内容却不是输入的内容,比如我输入11 11 ,结果却显示如下: ![图片说明](https://img-ask.csdn.net/upload/201607/22/1469160059_585329.png) 我感觉和下面的代码类似,下面却可以保存成功: //const char *filename = "C:/save_data.txt" ; //FILE *fp = fopen(filename,"wb") ; //if ( fp == NULL ) //{ // cout << "failed to save data " << endl ; // return -1 ; //} //char buf[] = "Hello" ; //fwrite(buf,1,5,fp) ; //fclose(fp); 为什么啊? 麻烦各位C++大神,点拨一下小弟!十分感谢!!!
通讯录存储结构是链表形式,类创建的通讯录怎么保存信息到txt文件并读取啊??是C++课设
我的Save和Read函数好像不行 下面是我的完整代码 求求哪位大佬帮我加这两个函数,课设要答辩了,来不及辽!!!! ``` #include <iostream> #include <string> #include <fstream> #include <string> using namespace std; typedef int contacttype; class contact{ public: string name; string address; string phonenum; contact *next; contacttype ctype; contact(){ name="0"; address="0"; phonenum="0"; ctype=0; next=NULL; } }; //定义联系人结点类 class contactlist{ public: contact *head; contactlist(){ head=new contact(); } void Mainscreen(contact *dead); void UserReg(contact *head); void Login(contact *head); void Title(); void Assert(contact *head); void Search(contact *head); void Delete(contact *head); void Change(contact *head); void Show(contact *head); void TypeShow(contact *head); friend void typeshow(contact *head,int choice); void Save(contact *head); void Read(contact *head); };//定义联系人链表类 void contactlist::UserReg(contact *head) { system("cls"); FILE *fp; char Linedata[50]={0},User[20],Pass[20]; fp = fopen("data.dat","at"); cout<<"******欢迎进入新账号注册新账号注册:******"<<endl; cout<<"请输入用户名:"; fflush(stdin); gets(User); cout<<"请输入密码:"; fflush(stdin); gets(Pass); strcpy(Linedata,User); strcat(Linedata,","); strcat(Linedata,Pass); strcat(Linedata,"\n"); fputs(Linedata,fp); fclose(fp); cout<<"注册成功!"<<endl; system("pause"); system("cls"); Title(); cout<<"等待转入登陆界面………………"<<endl; Login(head); } void contactlist::Login(contact *head)//登陆 { FILE *fp; int find=0; char User[20],Pass[20],Userstrcat[50]={0}; char c,Userdata[50]={0}; fp = fopen("data.dat","r"); cout<<"用户登录:"<<endl; cout<<"请输入用户名:"; fflush(stdin); gets(User); cout<<"请输入密码:"; fflush(stdin); gets(Pass); strcpy(Userstrcat,User); strcat(Userstrcat,","); strcat(Userstrcat,Pass); strcat(Userstrcat,"\n"); while (!feof(fp)) { fgets(Userdata,19,fp); if (strcmp(Userdata,Userstrcat)==0 ) { cout<<"登录成功!"<<endl; find=1; Read(head); //登陆成功后读取文件信息,保存在head链表里 system("cls"); Title(); Mainscreen(head); } fclose(fp); if (!find) { cout<<"用户名不存在或密码错误"<<endl; cout<<"请选择重新登陆(按数字1)或者注册新账号(按数字2):"; cin>>c; if(c=='1') Login(head); else if(c=='2') contactlist::UserReg(head); } } void contactlist::Save(contact *head) { FILE *fp; contact *point; point=head; fp=fopen("G:\\temp - 副本2\\lin.txt","wb+"); if(fp==NULL) { cout<<"can not open file"<<endl; exit(0); } else{ while (point) { fwrite(point, sizeof(class contact),1, fp); point=point->next; } } fclose(fp); } /* void contactlist::Read(contact *head) { FILE *p=fopen("G:\\temp - 副本2\\lin.txt","rb"); fread(head,sizeof(class contact),1,p); while(head->next){ head=head->next; fread(head,sizeof(class contact),1,p); } */ void contactlist::Assert(contact *head) { system("cls"); Title(); contact *p,*q; /* if(head->next==NULL) { p=new contact(); cout<<"当前通讯录为空,请输入第一个记录的联系人姓名:"; cin>>p->name; cout<<"请输入联系人的家庭住址:"; cin>>p->address; cout<<"请输入联系人的手机号码:"; cin>>p->phonenum; cout<<"1:朋友"<<endl; cout<<"2:同学"<<endl; cout<<"3:亲戚"<<endl; cout<<"4:同事"<<endl; cout<<"请选择联系人的分组:"; cin>>p->ctype; head->next=p; p->next=NULL; system("cls"); Title(); } else if(head->next!=NULL) { */ q=new contact; q=head; p=new contact; cout<<"请输入联系人的姓名:"; cin>>p->name; cout<<"请输入联系人的家庭住址:"; cin>>p->address; cout<<"请输入联系人的手机号码:"; cin>>p->phonenum; cout<<"联系人分类:"<<endl; cout<<"1:朋友"<<endl; cout<<"2:同学"<<endl; cout<<"3:亲戚"<<endl; cout<<"4:同事"<<endl; cout<<"请选择联系人的分组:"; cin>>p->ctype; p->next=q->next; q->next=p; system("cls"); Title(); //} contactlist::Mainscreen(head); } void contactlist::Delete(contact *head) { int flag=1; system("cls"); char de_con[10]; cout<<"请输入要删除记录的联系人姓名:"; cin>>de_con; contact *q,*front;// front=new contact; q=head; while((q->next)!=NULL) { char Name[20]; strcpy(Name, (q->next->name).c_str()); if(strcmp(de_con,Name)==0) { cout<<"已找到需要注销的记录,正在注销中…………"<<endl; q->next=q->next->next; cout<<"该数据已注销成功,返回主页面…………"<<endl; flag=0; break; } q=q->next; } if(flag==1) cout<<"要删除的记录不存在"<<endl; contactlist::Mainscreen(head); } void contactlist::Change(contact *head) { system("cls"); Title(); int flag=1; contact *q; char name_con[10]; cout<<"请输入你要修改记录的联系人姓名:"; cin>>name_con; q=head->next; while(q!=NULL) { char Name[20]; strcpy(Name, (q->name).c_str()); if(strcmp(Name,name_con)==0) { cout<<"请开始记录的修改:"<<endl; cout<<"姓名:"; cin>>q->name; cout<<"家庭住址:"; cin>>q->address; cout<<"电话号码:"; cin>>q->phonenum; cout<<"联系人分组:"; cout<<"1:朋友"<<endl; cout<<"2:同学"<<endl; cout<<"3:亲戚"<<endl; cout<<"4:同事"<<endl; cout<<"请选择联系人的类型:"; cin>>q->ctype; cout<<"个人信息修改完成!"<<endl; flag=0; break; } q=q->next; } if(flag==1) cout<<"查找的记录不存在"<<endl; contactlist::Mainscreen(head); } void contactlist::Search(contact *head) { system("cls"); Title(); int flag=1; char name_con[10]; cout<<"请输入你要查找记录的联系人姓名:"; cin>>name_con; contact *q; q=head->next; while(q!=NULL) {char Name[20]; strcpy(Name, (q->name).c_str()); if(strcmp(Name,name_con)==0) { cout<<"姓名:"<<" "; cout<<"家庭住址:"<<" "; cout<<"电话号码:"<<" "; cout<<"联系人分组:"<<" "<<endl; cout<<q->name<<" "; cout<<q->address<<" "; cout<<q->phonenum<<" "; switch(q->ctype){ case 1:cout<<"朋友 "<<endl;break; case 2:cout<<"同学 "<<endl;break; case 3:cout<<"亲戚 "<<endl;break; case 4:cout<<"同事 "<<endl;break; } flag=0; break; } q=q->next; } if(flag==1) cout<<"查找的记录不存在"<<endl; contactlist::Mainscreen(head); } void contactlist::Show(contact *head) { system("cls"); Title(); if(head->next==NULL) { cout<<"通讯录为空,请选择操作1插入联系人"<<endl; contactlist::Mainscreen(head); } else { contact *q; q=head->next; cout<<"姓名:"<<" "; cout<<"家庭住址:"<<" "; cout<<"电话号码:"<<" "; cout<<"分组:"<<endl; while(q!=NULL) { cout<<q->name<<" "; cout<<q->address<<" "; cout<<q->phonenum<<" "; switch(q->ctype){ case 1:cout<<"朋友 "<<endl;break; case 2:cout<<"同学 "<<endl;break; case 3:cout<<"亲戚 "<<endl;break; case 4:cout<<"同事 "<<endl;break; } q=q->next; } contactlist::Mainscreen(head); } } void typeshow(contact *head,int choice) { contact *p; p=head->next; int flag=0; while(p!=NULL){ if(p->ctype==choice){ cout<<"姓名:"<<" "; cout<<"家庭住址:"<<" "; cout<<"电话号码:"<<" "<<endl; cout<<p->name<<" "; cout<<p->address<<" "; cout<<p->phonenum<<" "<<endl; flag=1; } p=p->next; } if(!flag) cout<<"该分组没有记录!"<<endl; } void contactlist::TypeShow(contact *head) { system("cls"); Title(); if(head->next==NULL) { cout<<"通讯录为空,请选择操作1添加记录或6退出系统"<<endl; contactlist::Mainscreen(head); } else { int choice; cout<<"输出所有朋友的记录----------------1"<<endl; cout<<"输出所有同学的记录----------------2"<<endl; cout<<"输出所有亲戚的记录----------------3"<<endl; cout<<"输出所有同事的记录----------------4"<<endl; cout<<"请选择:"; cin>>choice; typeshow(head,choice); contactlist::Mainscreen(head); } } void contactlist::Mainscreen(contact *head) { int choice; char a='*'; cout<<endl; cout<<" "<<"按照信息后的数字提示选择相应的操作:"<<endl; for(int i=0;i<34;i++) cout<<a<<" "; cout<<endl; cout<<a<<" 添加新的记录---------------------------------------------- 1 "<<a<<endl; cout<<a<<" 根据姓名查找相应的记录------------------------------------ 2 "<<a<<endl; cout<<a<<" 根据姓名删除相应的记录------------------------------------ 3 "<<a<<endl; cout<<a<<" 根据姓名修改相应的记录------------------------------------ 4 "<<a<<endl; cout<<a<<" 显示当前数据库中所有的记录-------------------------------- 5 "<<a<<endl; cout<<a<<" 显示同一分组的记录---------------------------------------- 6 "<<a<<endl; cout<<a<<" 退出通讯录管理系统---------------------------------------- 7 "<<a<<endl; for(i=0;i<34;i++) cout<<a<<" "; cout<<endl; cout<<"请输入你的选择:"; cin>>choice; switch(choice) { case 1:contactlist::Assert(head);break; case 2:contactlist::Search(head);break; case 3:contactlist::Delete(head);break; case 4:contactlist::Change(head);break; case 5:contactlist::Show(head);break; case 6:contactlist::TypeShow(head);break; case 7:system("cls");Save(head);exit(0); } } void contactlist::Title() { char a='*'; for(int i=0;i<120;i++) cout<<a; cout<<endl; cout<<" 通讯录管理系统"<<endl; cout<<endl; for(i=0;i<120;i++) cout<<a; cout<<endl; } int main() { contactlist *s=new contactlist(); s->Title(); cout<<"欢迎进入通讯录管理系统,请选择登陆方式:"<<endl; int selectNum; cout<<"1 注册新账户"<<endl;//输出一个选择菜单 cout<<"2 已有的账户登录"<<endl; cout<<"3 退出通讯录管理系统"<<endl; cin>>selectNum; switch (selectNum) { case 1:s->UserReg(s->head);break; case 2:s->Login(s->head); break; case 3:system("cls");Save(head);exit(0); break; //退出之前,把改过的通讯录重新读入文档 } return 0; } ```
Devc++编译器中用c写文件存取为什么打开文件为乱码?
//首先我写了学生信息管理系统的添加数据函数,需要将数据保存在磁盘里,将数据写入文件那一块用的c语言,其他为c++,代码如下: void Add() { char a='Y'; FILE *fp; if((fp=fopen("informations.dat","w"))==NULL) { printf("无法打开此文件 !\n"); exit(0); } while(a=='Y') { //if() Info in; cout<<"请输入学生信息:"<<endl; cin>>in.id>>in.name>>in.score>>in.order; if(fwrite(&in,sizeof(struct Info),1,fp)!=1) cout<<"file write error"<<endl; cout<<"是否继续添加?(Y/N)"; cin>>a; //printf("%s",in.id); } fclose(fp); putchar(10); } //此时打开文件里是乱码,如下图 ![图片说明](https://img-ask.csdn.net/upload/201812/14/1544725957_932678.png) //另外写了一个只用来存文件的代码用来测试,打开就不是乱码,是正常数据。代码如下 ``` #include<iostream> using namespace std; struct student { string name; int grade; }; int main() { FILE *fp; student stu; if((fp=fopen("information","w"))==NULL) { printf("无法打开此文件 !\n"); exit(0); } printf("请输入学号:"); scanf("%s",&stu.name); printf("请输入成绩:"); scanf("%s",&stu.grade); if(fwrite(&stu,sizeof(struct student),1,fp)!=1) cout<<"file write error"<<endl; fclose(fp); putchar(10); return 0; } ``` //若是将add函数中的信息输入语句cin 用scanf替换则文件中存不进数据,代码如下 ``` void Add() { char a='Y'; FILE *fp; //ofstream file("info.xlsx",ios_base::in); initial(); if((fp=fopen("informations.dat","w"))==NULL) { printf("无法打开此文件 !\n"); exit(0); } while(a=='Y') { //if() Info in; cout<<"请输入学生信息:"<<endl; //cin>>in.id>>in.name>>in.score>>in.order; scanf("%s",&in.id); printf("请输入姓名:"); scanf("%s",&in.name); printf("请输入成绩:"); scanf("%d",&in.score); printf("请输入排名:"); scanf("%d",&in.order); if(fwrite(&in,sizeof(struct Info),1,fp)!=1) cout<<"file write error"<<endl; cout<<"是否继续添加?(Y/N)"; cin>>a; //printf("%s",in.id); } fclose(fp); putchar(10); } ``` 求解,很想知道为什么
想用树莓派做行人识别,不知道可以吗
先在树莓派上装c++版的opencv,用板子上的csi摄像头采集图像,然后用HOG特征和SVM来检测其中的行人。不知道树莓派算力够吗? 想把这个程序写进去。 ``` #include <iostream> #include <fstream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/objdetect/objdetect.hpp> #include <opencv2/ml/ml.hpp> using namespace std; using namespace cv; #define PosSamNO 1114 //正样本个数 #define NegSamNO 12180 //负样本个数 #define TRAIN true//是否进行训练,true表示重新训练,false表示读取xml文件中的SVM模型 #define CENTRAL_CROP false //true:训练时,对96*160的INRIA正样本图片剪裁出中间的64*128大小人体 //HardExample:负样本个数。如果HardExampleNO大于0,表示处理完初始负样本集后,继续处理HardExample负样本集。 //不使用HardExample时必须设置为0,因为特征向量矩阵和特征类别矩阵的维数初始化时用到这个值 #define HardExampleNO 433 //继承自CvSVM的类,因为生成setSVMDetector()中用到的检测子参数时,需要用到训练好的SVM的decision_func参数, //但通过查看CvSVM源码可知decision_func参数是protected类型变量,无法直接访问到,只能继承之后通过函数访问 class MySVM : public CvSVM { public: //获得SVM的决策函数中的alpha数组 double * get_alpha_vector() { return this->decision_func->alpha; } //获得SVM的决策函数中的rho参数,即偏移量 float get_rho() { return this->decision_func->rho; } }; int main() { //检测窗口(64,128),块尺寸(16,16),块步长(8,8),cell尺寸(8,8),直方图bin个数9 HOGDescriptor hog(Size(64,128),Size(16,16),Size(8,8),Size(8,8),9);//HOG检测器,用来计算HOG描述子的 int DescriptorDim;//HOG描述子的维数,由图片大小、检测窗口大小、块大小、细胞单元中直方图bin个数决定 MySVM svm;//SVM分类器 //若TRAIN为true,重新训练分类器 if(TRAIN) { string ImgName;//图片名(绝对路径) ifstream finPos("d:/hogmit/pos/pos.txt");//正样本图片的文件名列表 //ifstream finPos("PersonFromVOC2012List.txt");//正样本图片的文件名列表 ifstream finNeg("d:/hogmit/neg/neg.txt");//负样本图片的文件名列表 Mat sampleFeatureMat;//所有训练样本的特征向量组成的矩阵,行数等于所有样本的个数,列数等于HOG描述子维数 Mat sampleLabelMat;//训练样本的类别向量,行数等于所有样本的个数,列数等于1;1表示有人,-1表示无人 //依次读取正样本图片,生成HOG描述子 for(int num=0; num<PosSamNO && getline(finPos,ImgName); num++) { cout<<"处理:"<<ImgName<<endl; //ImgName = "D:\\DataSet\\PersonFromVOC2012\\" + ImgName;//加上正样本的路径名 ImgName = "d:/hogmit/pos/" + ImgName;//加上正样本的路径名 Mat src = imread(ImgName);//读取图片 if(CENTRAL_CROP) src = src(Rect(16,16,64,128));//将96*160的INRIA正样本图片剪裁为64*128,即剪去上下左右各16个像素 //resize(src,src,Size(64,128)); vector<float> descriptors;//HOG描述子向量 hog.compute(src,descriptors,Size(8,8));//计算HOG描述子,检测窗口移动步长(8,8) // cout<<"描述子维数:"<<descriptors.size()<<endl; //处理第一个样本时初始化特征向量矩阵和类别矩阵,因为只有知道了特征向量的维数才能初始化特征向量矩阵 if( 0 == num ) { DescriptorDim = descriptors.size();//HOG描述子的维数 //初始化所有训练样本的特征向量组成的矩阵,行数等于所有样本的个数,列数等于HOG描述子维数sampleFeatureMat sampleFeatureMat = Mat::zeros(PosSamNO+NegSamNO+HardExampleNO, DescriptorDim, CV_32FC1); //初始化训练样本的类别向量,行数等于所有样本的个数,列数等于1;1表示有人,0表示无人 sampleLabelMat = Mat::zeros(PosSamNO+NegSamNO+HardExampleNO, 1, CV_32FC1); } //将计算好的HOG描述子复制到样本特征矩阵sampleFeatureMat for(int i=0; i<DescriptorDim; i++) sampleFeatureMat.at<float>(num,i) = descriptors[i];//第num个样本的特征向量中的第i个元素 sampleLabelMat.at<float>(num,0) = 1;//正样本类别为1,有人 } //依次读取负样本图片,生成HOG描述子 for(int num=0; num<NegSamNO && getline(finNeg,ImgName); num++) { cout<<"处理:"<<ImgName<<endl; ImgName = "d:/hogmit/neg/" + ImgName;//加上负样本的路径名 Mat src = imread(ImgName);//读取图片 //resize(src,img,Size(64,128)); vector<float> descriptors;//HOG描述子向量 hog.compute(src,descriptors,Size(8,8));//计算HOG描述子,检测窗口移动步长(8,8) //cout<<"描述子维数:"<<descriptors.size()<<endl; //将计算好的HOG描述子复制到样本特征矩阵sampleFeatureMat for(int i=0; i<DescriptorDim; i++) sampleFeatureMat.at<float>(num+PosSamNO,i) = descriptors[i];//第PosSamNO+num个样本的特征向量中的第i个元素 sampleLabelMat.at<float>(num+PosSamNO,0) = -1;//负样本类别为-1,无人 } //处理HardExample负样本 if(HardExampleNO > 0) { ifstream finHardExample("d:/hogmit/hard/hard.txt");//HardExample负样本的文件名列表 //依次读取HardExample负样本图片,生成HOG描述子 for(int num=0; num<HardExampleNO && getline(finHardExample,ImgName); num++) { cout<<"处理:"<<ImgName<<endl; ImgName = "d:/hogmit/hard/" + ImgName;//加上HardExample负样本的路径名 Mat src = imread(ImgName);//读取图片 //resize(src,img,Size(64,128)); vector<float> descriptors;//HOG描述子向量 hog.compute(src,descriptors,Size(8,8));//计算HOG描述子,检测窗口移动步长(8,8) //cout<<"描述子维数:"<<descriptors.size()<<endl; //将计算好的HOG描述子复制到样本特征矩阵sampleFeatureMat for(int i=0; i<DescriptorDim; i++) sampleFeatureMat.at<float>(num+PosSamNO+NegSamNO,i) = descriptors[i];//第PosSamNO+num个样本的特征向量中的第i个元素 sampleLabelMat.at<float>(num+PosSamNO+NegSamNO,0) = -1;//负样本类别为-1,无人 } } //输出样本的HOG特征向量矩阵到文件 ofstream fout("d:/xlw/SampleFeatureMat.txt"); for(int i=0; i<PosSamNO+NegSamNO; i++) { fout<<i<<endl; for(int j=0; j<DescriptorDim; j++) { fout<<sampleFeatureMat.at<float>(i,j)<<" "; } fout<<endl; } //训练SVM分类器 //迭代终止条件,当迭代满1000次或误差小于FLT_EPSILON时停止迭代 CvTermCriteria criteria = cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 1000, FLT_EPSILON); //SVM参数:SVM类型为C_SVC;线性核函数;松弛因子C=0.01 CvSVMParams param(CvSVM::C_SVC, CvSVM::LINEAR, 0, 1, 0, 0.01, 0, 0, 0, criteria); cout<<"开始训练SVM分类器"<<endl; double time0=static_cast<double>(getTickCount()); svm.train(sampleFeatureMat,sampleLabelMat, Mat(), Mat(), param);//训练分类器 time0=((double)getTickCount()-time0)/getTickFrequency(); cout<<"训练完成"<<endl; cout<<"训练花费时间:"<<time0<<endl; svm.save("d:/xlw/SVM_HOG_mit_inria(1114pos+12180neg+433hard).xml");//将训练好的SVM模型保存为xml文件 } else //若TRAIN为false,从XML文件读取训练好的分类器 { cout<<"fail train"<<endl; //svm.load("SVM_HOG_2400PosINRIA_12000Neg_HardExample(误报少了漏检多了).xml");//从XML文件读取训练好的SVM模型 svm.load("d:/LBP/SVM_Model.xml"); } /************************************************************************************************* 线性SVM训练完成后得到的XML文件里面,有一个数组,叫做support vector,还有一个数组,叫做alpha,有一个浮点数,叫做rho; 将alpha矩阵同support vector相乘,注意,alpha*supportVector,将得到一个列向量。之后,再该列向量的最后添加一个元素rho。 如此,变得到了一个分类器,利用该分类器,直接替换opencv中行人检测默认的那个分类器(cv::HOGDescriptor::setSVMDetector()), 就可以利用你的训练样本训练出来的分类器进行行人检测了。 ***************************************************************************************************/ DescriptorDim = svm.get_var_count();//特征向量的维数,即HOG描述子的维数 int supportVectorNum = svm.get_support_vector_count();//支持向量的个数 cout<<"支持向量个数:"<<supportVectorNum<<endl; Mat alphaMat = Mat::zeros(1, supportVectorNum, CV_32FC1);//alpha向量,长度等于支持向量个数 Mat supportVectorMat = Mat::zeros(supportVectorNum, DescriptorDim, CV_32FC1);//支持向量矩阵 Mat resultMat = Mat::zeros(1, DescriptorDim, CV_32FC1);//alpha向量乘以支持向量矩阵的结果 //将支持向量的数据复制到supportVectorMat矩阵中 for(int i=0; i<supportVectorNum; i++) { const float * pSVData = svm.get_support_vector(i);//返回第i个支持向量的数据指针 for(int j=0; j<DescriptorDim; j++) { //cout<<pData[j]<<" "; supportVectorMat.at<float>(i,j) = pSVData[j]; } } //将alpha向量的数据复制到alphaMat中 double * pAlphaData = svm.get_alpha_vector();//返回SVM的决策函数中的alpha向量 for(int i=0; i<supportVectorNum; i++) { alphaMat.at<float>(0,i) = pAlphaData[i]; } //计算-(alphaMat * supportVectorMat),结果放到resultMat中 //gemm(alphaMat, supportVectorMat, -1, 0, 1, resultMat);//不知道为什么加负号? resultMat = -1 * alphaMat * supportVectorMat; //得到最终的setSVMDetector(const vector<float>& detector)参数中可用的检测子 vector<float> myDetector; //将resultMat中的数据复制到数组myDetector中 for(int i=0; i<DescriptorDim; i++) { myDetector.push_back(resultMat.at<float>(0,i)); } //最后添加偏移量rho,得到检测子 myDetector.push_back(svm.get_rho()); cout<<"检测子维数:"<<myDetector.size()<<endl; //设置HOGDescriptor的检测子 HOGDescriptor myHOG; myHOG.setSVMDetector(myDetector); //myHOG.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); //保存检测子参数到文件 ofstream fout("d:/xlw/HOGDetectorForOpenCV.txt"); for(int i=0; i<myDetector.size(); i++) { fout<<myDetector[i]<<endl; } /**************读入图片进行HOG行人检测******************/ Mat src = imread("d:/timg.png"); //Mat src = imread("2007_000423.jpg"); //Mat src = imread("1.png"); vector<Rect> found, found_filtered;//矩形框数组 cout<<"进行多尺度HOG人体检测"<<endl; myHOG.detectMultiScale(src, found, 0, Size(8,8), Size(32,32), 1.05, 2);//对图片进行多尺度行人检测 //src为输入待检测的图片;found为检测到目标区域列表;参数3为程序内部计算为行人目标的阈值,也就是检测到的特征到SVM分类超平面的距离; //参数4为滑动窗口每次移动的距离。它必须是块移动的整数倍;参数5为图像扩充的大小;参数6为比例系数,即测试图片每次尺寸缩放增加的比例; //参数7为组阈值,即校正系数,当一个目标被多个窗口检测出来时,该参数此时就起了调节作用,为0时表示不起调节作用。 cout<<"找到的矩形框个数:"<<found.size()<<endl; //找出所有没有嵌套的矩形框r,并放入found_filtered中,如果有嵌套的话,则取外面最大的那个矩形框放入found_filtered中 for(int i=0; i < found.size(); i++) { Rect r = found[i]; int j=0; for(; j < found.size(); j++) if(j != i && (r & found[j]) == r) break; if( j == found.size()) found_filtered.push_back(r); } //画矩形框,因为hog检测出的矩形框比实际人体框要稍微大些,所以这里需要做一些调整 for(int i=0; i<found_filtered.size(); i++) { Rect r = found_filtered[i]; r.x += cvRound(r.width*0.1); r.width = cvRound(r.width*0.8); r.y += cvRound(r.height*0.07); r.height = cvRound(r.height*0.8); rectangle(src, r.tl(), r.br(), Scalar(0,255,0), 3); } imwrite("d:/SVM/ImgProcessed3.jpg",src); namedWindow("src",0); imshow("src",src); waitKey();//注意:imshow之后必须加waitKey,否则无法显示图像 /******************读入单个64*128的测试图并对其HOG描述子进行分类*********************/ ////读取测试图片(64*128大小),并计算其HOG描述子 //Mat testImg = imread("person014142.jpg"); //Mat testImg = imread("noperson000026.jpg"); //vector<float> descriptor; //hog.compute(testImg,descriptor,Size(8,8));//计算HOG描述子,检测窗口移动步长(8,8) //Mat testFeatureMat = Mat::zeros(1,3780,CV_32FC1);//测试样本的特征向量矩阵 //将计算好的HOG描述子复制到testFeatureMat矩阵中 //for(int i=0; i<descriptor.size(); i++) // testFeatureMat.at<float>(0,i) = descriptor[i]; //用训练好的SVM分类器对测试图片的特征向量进行分类 //int result = svm.predict(testFeatureMat);//返回类标 //cout<<"分类结果:"<<result<<endl; system("pause"); } ```
为什么键盘输入字符串和文件导入字符串都有错?错误应该怎么改?
``` #include <iostream.h> #include <windows.h> #include <string> #include<fstream> using namespace std; class Stack;//类Stack的声明 /* 定义一个链栈结点类Stacknode */ class Stacknode { friend class Stack;//申请友元类 private: Stacknode(Stacknode *nextp=NULL);//构造函数 Stacknode(char &newdata,Stacknode *nextp=NULL);//构造函数 int data;//数据元素 Stacknode *next;//递归定义指向后继结点的指针 }; /* Stacknode的实现部分 */ Stacknode::Stacknode(Stacknode *nextp)//构造函数 { next=nextp; } Stacknode::Stacknode(char &newdata,Stacknode *nextp)//构造函数 { data=newdata; next=nextp; } //结点类Stacknode的定义结束 /* 定义一个链栈类Stack */ class Stack { public: Stack();//创建一个空栈 ~Stack();//回收一个栈 void clear();//销毁一个栈 bool empty() const;//确定栈是否已空 bool push(char &item);//把数据压进栈 bool pop();//出栈 bool pop(char &item);//把数据弹出栈,返回 bool top(char &item) const;//取出栈顶元素 private: Stacknode *newnode(Stacknode *nextp=NULL); Stacknode *newnode(char &item,Stacknode *nextp=NULL);//创建新的结点 Stacknode *Stacktop; int Stacklength; }; /* Stack的实现部分 */ Stacknode *Stack::newnode(Stacknode *nextp)//创建新的结点,不带数据 { return new Stacknode(nextp); } Stacknode *Stack::newnode(char &item,Stacknode *nextp)//创建新的结点,数据域赋值 { return new Stacknode(item,nextp); } //以下为栈类Stack的函数定义 Stack::Stack()//创建一个空栈 { Stacktop=newnode();//创建一个栈顶指针初始化,相当于Stacktop=NULL;本链表没有用头结点 Stacklength=0; } Stack::~Stack()//回收一个栈 { clear(); delete Stacktop;//释放栈底 } void Stack::clear()//销毁一个栈 { while(pop());//不停地出栈,而每次释放空间在出栈函数中完成 } bool Stack::empty() const//确定栈是否已空 { return Stacklength<=0?true:false; } bool Stack::push(char &item)//数据进栈 { Stacknode *newnodep;//定义指针newnodep,准备指向申请的新结点 newnodep=newnode(item,Stacktop);//申请新结点,把数据存入,把指针域指向头指针 if(!newnodep)//如果没有申请到空间,返回失败 return false; Stacktop=newnodep;//改链,完成进栈 Stacklength++;//栈的长度增加 return true;//本次操作成功 } bool Stack::pop()//出栈,不要栈顶数据 { Stacknode *usednodep;//定义指针usednodep,准备指向出栈的结点 if(!empty())//判断是否栈空 { usednodep=Stacktop;//指向出栈的结点 Stacktop=Stacktop->next;//栈顶指针后移 delete usednodep;//释放空间 Stacklength--;//栈的长度减少 return true;//本次操作成功 } return false;//否则本次操作失败 } bool Stack::pop(char &item)//出栈,把栈顶数据弹返回去 { Stacknode *usednodep;//定义指针usednodep,准备指向出栈的结点 if(!empty())//判断是否栈空 { usednodep=Stacktop;//指向出栈的结点 Stacktop=Stacktop->next;//栈顶指针后移 item=usednodep->data;//把数据保留下来,返回去 delete usednodep;//释放空间 Stacklength--;//栈的长度减少 return true;//本次操作成功 } return false;//否则本次操作失败 } bool Stack::top(char &item) const//取出栈顶数据返回去 { if(!empty())//如果栈不空,记录当前栈顶元素 { item=Stacktop->data;//通过item返回去 return true;//本次操作成功 } return false;//否则本次操作失败 } /* 定义一个功能类SymbolMatching */ class SymbolMatching { private: Stack *stack; public: SymbolMatching();//构造函数 ~SymbolMatching();//析构函数 bool manualinputdatabase(char *database);//人工输入数据信息 bool fileguidedatabase(char *filename);//文件导入数据信息 }; SymbolMatching::SymbolMatching()//构造函数 { stack=new Stack; } SymbolMatching::~SymbolMatching()//析构函数 { delete stack; } bool SymbolMatching::manualinputdatabase(char *database)//人工输入数据信息 { int i=0; char match,symbol; bool is_match=true; while(database[i]!='\0'&&is_match) { symbol=database[i++]; if(symbol=='('||symbol=='{'||symbol=='[') stack->push(symbol);//入栈 else if(symbol==')'||symbol=='}'||symbol==']') { if(stack->empty()) { if(database[i+1]!='\0') cout<<"右边符号多于左边符号!"<<endl; else cout<<"符号"<<symbol<<"无法找到与之匹配的符号!"<<endl; is_match=false; } else { stack->top(match); stack->pop();//出栈 is_match=(symbol==')'&&match=='('||symbol==']'&&match=='['||symbol=='}'&&match=='{'); if(!is_match) cout<<"符号"<<match<<"和"<<symbol<<"不匹配!"<<endl; } } } if(is_match) { if(!stack->empty())//栈不为空 { cout<<"左边符号多于右边符号!"<<endl; is_match=false; } else cout<<"左右符号匹配次序正确!"<<endl; } stack->clear(); return is_match; } bool SymbolMatching::fileguidedatabase(char *filename)//文件导入数据信息 { int i=0; char match,symbol; bool is_match=true; while(filename[i]!='\0'&&is_match) { symbol=filename[i++]; if(symbol=='('||symbol=='{'||symbol=='[') stack->push(symbol);//入栈 else if(symbol==')'||symbol=='}'||symbol==']') { if(stack->empty()) { if(filename[i+1]!='\0') cout<<"右边符号多于左边符号!"<<endl; else cout<<"符号"<<symbol<<"无法找到与之匹配的符号!"<<endl; is_match=false; } else { stack->top(match); stack->pop();//出栈 is_match=(symbol==')'&&match=='('||symbol==']'&&match=='['||symbol=='}'&&match=='{'); if(!is_match) cout<<"符号"<<match<<"和"<<symbol<<"不匹配!"<<endl; } } } if(is_match) { if(!stack->empty())//栈不为空 { cout<<"左边符号多于右边符号!"<<endl; is_match=false; } else cout<<"左右符号匹配次序正确!"<<endl; } stack->clear(); return is_match; } /* 定义一个实现链栈功能的菜单处理类interfacebase */ class interfacebase { private: SymbolMatching SymbolMatchingonface; public: void clearscreen(void);//清屏 void showmenu(void);//显示菜单函数 int userchoice(void);//用户的选项 void processmenu(int menuchoice);//菜单函数 }; /* interfacebase类的实现部分 */ void interfacebase::clearscreen(void) { system("cls"); } void interfacebase::showmenu(void) { cout<<"链式堆栈实现括号匹配判断的功能菜单"<<endl; cout<<"=================================="<<endl; cout<<"1.人工输入数据信息"<<endl; cout<<"2.文件导入数据信息"<<endl; cout<<"0.退出"<<endl; cout<<"=================================="<<endl; } int interfacebase::userchoice(void) { int menuchoice; cout<<"请输入您的选择:"; cin>>menuchoice; return menuchoice; } void interfacebase::processmenu(int menuchoice) { switch(menuchoice)//根据用户的选择进行相应的操作 { case 1: { string str; char temp; cout<<"输入字符串,按回车键结束输入:"<<endl; while((temp=cin.get())!='\n') { str +=temp; } const int LEN =str.length(); char* database = new char[LEN];//根据输入字符串的长度,创建字符数组 for(int i = 0;i<LEN;i++) //将字符串保存到字符数组中 { database[i]=str[i]; } SymbolMatchingonface.manualinputdatabase(database); delete database; } break; case 2: { ifstream in("data.txt"); char data,j,*filename=new char[100]; int num=0; while(!in.eof()) { in>>data; filename[num]=data; cout<<filename[num]; num++; } cout<<endl; SymbolMatchingonface.fileguidedatabase(filename); delete filename; } break; case 0: exit(0); default: cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl; break; } } /* 程序主入口 */ void main(void) { int menuchoice;//定义变量,菜单选单项的选择 interfacebase interfacebasenow; system("color f0");//修改屏幕的背景色和字的颜色 interfacebasenow.clearscreen();//清屏 while(1)//永真循环 { interfacebasenow.showmenu();//显示菜单 menuchoice=interfacebasenow.userchoice();//获取用户的选择 interfacebasenow.processmenu(menuchoice);//处理用户的选择 system("pause"); interfacebasenow.clearscreen();//清屏 } }//主函数结束 ```
用vs2015和opencv做人脸识别时碰到LNK2019的错误
错误如下: ![图片说明](https://img-ask.csdn.net/upload/201603/18/1458277026_790331.png) 不是链接器的问题,应该是代码的问题,但我对c++和vs还不太熟悉。请哪位大神告知。代码如下: #include "stdafx.h" #include <opencv2/opencv.hpp> #include <opencv2/contrib_world.hpp> #include "opencv2/core.hpp" #include "opencv2/face.hpp" #include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp" //#include <opencv2/face/facerec.hpp> #include <iostream> #include <fstream> #include <sstream> using namespace cv; using namespace cv::face; using namespace std; static Mat norm_0_255(InputArray _src) { Mat src = _src.getMat(); // 创建和返回一个归一化后的图像矩阵: Mat dst; switch (src.channels()) { case 1: cv::normalize(_src, dst, 0, 255, NORM_MINMAX, CV_8UC1); break; case 3: cv::normalize(_src, dst, 0, 255, NORM_MINMAX, CV_8UC3); break; default: src.copyTo(dst); break; } return dst; } //使用CSV文件去读图像和标签,主要使用stringstream和getline方法 static void read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator = ';') { std::ifstream file(filename.c_str(), ifstream::in); if (!file) { string error_message = "No valid input file was given, please check the given filename."; CV_Error(Error::StsBadArg, error_message); } string line, path, classlabel; while (getline(file, line)) { stringstream liness(line); getline(liness, path, separator); getline(liness, classlabel); if (!path.empty() && !classlabel.empty()) { images.push_back(imread(path, 0)); labels.push_back(atoi(classlabel.c_str())); } } } int main() { // 检测合法的命令,显示用法 // 如果没有参数输入则退出!. string output_folder; output_folder = string("D:\\Documents\\faceData\\output"); //读取你的CSV文件路径. string fn_csv = string("D:\\Documents\\faceData\\ORL\\at.txt"); // 2个容器来存放图像数据和对应的标签 vector<Mat> images; vector<int> labels; // 读取数据. 如果文件不合法就会出错 // 输入的文件名已经有了. try { read_csv(fn_csv, images, labels); } catch (cv::Exception& e) { cerr << "Error opening file " << fn_csv << ". Reason: " << e.msg << endl; // 文件有问题,我们啥也做不了了,退出了 exit(1); } // 如果没有读取到足够图片,我们也得退出. if (images.size() <= 1) { string error_message = "This demo needs at least 2 images to work. Please add more images to your data set!"; CV_Error(Error::StsError, error_message); } // 得到第一张照片的高度. 在下面对图像 // 变形到他们原始大小时需要 int height = images[0].rows; // 下面的几行代码仅仅是从你的数据集中移除最后一张图片 //[gm:自然这里需要根据自己的需要修改,他这里简化了很多问题] Mat testSample = images[images.size() - 1]; int testLabel = labels[labels.size() - 1]; images.pop_back(); labels.pop_back(); // 下面几行创建了一个特征脸模型用于人脸识别, // 通过CSV文件读取的图像和标签训练它。 // T这里是一个完整的PCA变换 //如果你只想保留10个主成分,使用如下代码 //cv::createEigenFaceRecognizer(10); // // 如果你还希望使用置信度阈值来初始化,使用以下语句: // cv::createEigenFaceRecognizer(10, 123.0); // // 如果你使用所有特征并且使用一个阈值,使用以下语句: // cv::createEigenFaceRecognizer(0, 123.0); // Ptr<BasicFaceRecognizer> model = createEigenFaceRecognizer(); model->train(images, labels); // 下面对测试图像进行预测,predictedLabel是预测标签结果 int predictedLabel = model->predict(testSample); // // 还有一种调用方式,可以获取结果同时得到阈值: // int predictedLabel = -1; // double confidence = 0.0; // model->predict(testSample, predictedLabel, confidence); // string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel); cout << result_message << endl; // 这里是如何获取特征脸模型的特征值的例子,使用了getMat方法: Mat eigenvalues = model->getEigenValues(); // 同样可以获取特征向量: Mat W = model->getEigenVectors(); // 得到训练图像的均值向量 Mat mean = model->getMean(); // 显示还是保存: imshow("mean", norm_0_255(mean.reshape(1, images[0].rows))); imwrite(format("%s/mean.png", output_folder.c_str()), norm_0_255(mean.reshape(1, images[0].rows))); // 显示还是保存特征脸: for (int i = 0; i < min(10, W.cols); i++) { string msg = format("Eigenvalue #%d = %.5f", i, eigenvalues.at<double>(i)); cout << msg << endl; // 得到第 #i个特征 Mat ev = W.col(i).clone(); //把它变成原始大小,为了把数据显示归一化到0~255. Mat grayscale = norm_0_255(ev.reshape(1, height)); // 使用伪彩色来显示结果,为了更好的感受. Mat cgrayscale; applyColorMap(grayscale, cgrayscale, COLORMAP_JET); // 显示或者保存: imshow(format("eigenface_%d", i), cgrayscale); imwrite(format("%s/eigenface_%d.png", output_folder.c_str(), i), norm_0_255(cgrayscale)); } // 在一些预测过程中,显示还是保存重建后的图像: for (int num_components = 10; num_components <300; num_components += 15) { // 从模型中的特征向量截取一部分 Mat evs = Mat(W, Range::all(), Range(0, num_components)); Mat projection = LDA::subspaceProject(evs, mean, images[0].reshape(1, 1)); Mat reconstruction = LDA::subspaceReconstruct(evs, mean, projection); // 归一化结果,为了显示: reconstruction = norm_0_255(reconstruction.reshape(1, images[0].rows)); // 显示或者保存: imshow(format("eigenface_reconstruction_%d", num_components), reconstruction); imwrite(format("%s/eigenface_reconstruction_%d.png", output_folder.c_str(), num_components), reconstruction); } // 如果我们不是存放到文件中,就显示他,这里使用了暂定等待键盘输入: waitKey(0); return 0; }
Ubuntu 下codeblocks编译C++,更改头文件后编译不成功问题
我的系统是Ubuntu18,codeblocks IDE,在复习C++,本来编译是没有问题的,更改头文件后出现问题,编译器貌似无视了我对头文件和类外定义文件的修改,检查target没有问题。代码如下,应该是没有问题的: main文件: ``` #include <iostream> #include "Box.h" using namespace std; int main(){ Box box1; Box box2{10,10,10,10}; Box box3{10}; Box box4{10,10}; box1.test(); cout<<box1.volume()<<endl; cout<<box2.volume()<<endl; // cout<<box4.get_count()<<endl; } ``` Box.h 头文件 ``` #ifndef BOX_H #define BOX_H class Box { public: Box(); Box(double lv,double wv,double hv,double n); explicit Box(double side); Box(int i,int n); double volume(); void test(); int get_count(); private: double length{1}; double width{1}; double height{1}; static int object_count; }; #endif // BOX_H ``` Box.cpp文件 ``` #include "Box.h" #include <iostream> using namespace std; int Box::object_count {}; Box::Box() { cout<<"no index construction function"<<endl; //默认的无参构造函数一旦指定,就不会额外创建 ++object_count; cout<<"object_count="<<object_count<<endl; } Box::Box(double side):Box(side,side,side,side) { cout<<"beg construction function"<<endl; ++object_count; } Box::Box(double lv,double wv,double hv,double n):length{lv},width{wv},height{hv} { cout<<"three index construction function"<<endl; ++object_count; } Box::Box(int i,int j){ cout<<"int construction function"<<endl; ++object_count; } void Box::test(){ cout<<"test"<<endl; } double Box::volume(){ return length*width*height; cout<<"??"<<endl; } int Box::get_count(){ return object_count; } ``` 刚开始我试着加入静态数据成员object_count,报错找不到get_count()函数,于是加入了test()函数进行测试,保存编译后仍然没用,报错如下: -------------- Build: Debug in Class_review (compiler: GNU GCC Compiler)--------------- g++ -Wall -fexceptions -g -Iinclude -c /home/tianrui/workspace/C++/Beginning_Learn/Class_review/main.cpp -o obj/Debug/main.o /home/tianrui/workspace/C++/Beginning_Learn/Class_review/main.cpp: In function ‘int main()’: /home/tianrui/workspace/C++/Beginning_Learn/Class_review/main.cpp:11:10: **error: ‘class Box’ has no member named ‘test’ box1.test();** ^~~~ Process terminated with status 1 (0 minute(s), 0 second(s)) 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) 我测试了很多次,更改Box.cpp与Box.h文件后Rebulid根本毫无反应!! target里明明都选上了。。
我用c++写了个图像显示程序,为什么显示出来是这样的?
用c++写了个图像显示程序,但是显示出来的图像是这样的![图片说明](https://img-ask.csdn.net/upload/201905/27/1558941977_691414.png) 有没有童鞋帮我看看哪里出错了,,,万分感激! 这是我的代码 #include<iostream> #include<Windows.h> #include<malloc.h> #include<stdlib.h> #include<stdio.h> #include<string.h> using namespace std; //显示位图文件头信息 void showBmpHead(BITMAPFILEHEADER pBmpHead) { cout<<"位图文件头:"<<endl; cout<<"文件大小:"<<pBmpHead.bfSize<<endl; cout<<"保留字_1:"<<pBmpHead.bfReserved1<<endl; cout<<"保留字_2:"<<pBmpHead.bfReserved2<<endl; cout<<"实际位图数据的偏移字节数:"<<pBmpHead.bfOffBits<<endl<<endl; } void showBmpInforHead(tagBITMAPINFOHEADER pBmpInforHead) { cout<<"位图信息头:"<<endl; cout<<"结构体的长度:"<<pBmpInforHead.biSize<<endl; cout<<"位图宽:"<<pBmpInforHead.biWidth<<endl; cout<<"位图高:"<<pBmpInforHead.biHeight<<endl; cout<<"biPlanes平面数:"<<pBmpInforHead.biPlanes<<endl; cout<<"biBitCount采用颜色位数:"<<pBmpInforHead.biBitCount<<endl; cout<<"压缩方式:"<<pBmpInforHead.biCompression<<endl; cout<<"biSizeImage实际位图数据占用的字节数:"<<pBmpInforHead.biSizeImage<<endl; cout<<"X方向分辨率:"<<pBmpInforHead.biXPelsPerMeter<<endl; cout<<"Y方向分辨率:"<<pBmpInforHead.biYPelsPerMeter<<endl; cout<<"使用的颜色数:"<<pBmpInforHead.biClrUsed<<endl; cout<<"重要颜色数:"<<pBmpInforHead.biClrImportant<<endl; } void main () { char fileName[30]; //定义打开图像名字 char *buf; //定义文件读取缓冲区 char *p; int r,g,b,pix; HWND wnd; //窗口句柄 HDC dc; //绘图设备环境句柄 FILE *fp; //定义文件指针 FILE *fpw; //定义保存文件指针 DWORD w,h; //定义读取图像的长和宽 DWORD bitSize; //定义图像的大小 BITMAPFILEHEADER bf; //图像文件头 BITMAPINFOHEADER bi; //图像文件头信息 cout<<"请输入要打开文件的名字:(如:e:\\1.bmp)"; cin>>fileName; if((fp=fopen(fileName,"rb"))==NULL) { cout<<"文件未找到!"; exit(0); } fread(&bf,sizeof(BITMAPFILEHEADER),1,fp);//读取BMP文件头文件 showBmpHead(bf); fread(&bi,sizeof(BITMAPINFOHEADER),1,fp);//读取BMP文件头文件信息 showBmpInforHead(bi); w=bi.biWidth; //获取图像的宽 h=bi.biHeight; //获取图像的高 bitSize=bi.biSizeImage; //获取图像的size buf=(char*)malloc(w*h*3); //分配缓冲区大小 fseek(fp,long(40+14+sizeof(RGBQUAD)),0);//定位到像素起始位置 fread(buf,1,w*h*3,fp); //开始读取数据 wnd=GetForegroundWindow(); //获取窗口句柄 dc=GetDC(wnd); //获取绘图设备 DWORD x=440; DWORD y=160;//图片显示的左上角点 p=buf; for(DWORD j=0;j<h;j++) { for(DWORD i=0;i<w;i++) { b=*p++;g=*p++;r=*p++; pix=RGB(r,g,b); SetPixel(dc,x+i,y+h-j,pix); } } fpw=fopen("LenaSaved.bmp","wb"); fwrite(&bf,sizeof(BITMAPFILEHEADER),1,fpw); //写入文件头 fwrite(&bi,sizeof(BITMAPINFOHEADER),1,fpw); //写入文件头信息 p=buf; for( DWORD j=0;j<h;j++) { for(DWORD i=0;i<w*3;i++) { fwrite(p++,1,1,fpw); } } fclose(fpw); fclose(fp); //return fp; system("pause"); }
Huffman树的问题,输入要统计的文件就闪掉
``` #include "stdafx.h" #include<iostream> #include<fstream> #include<cstring> #include<iomanip> using namespace std; typedef struct huffmannode { char ch; int weight; int parent; int lchild; int rchild; int index; //记录编码在数组中出现的位置 char code[40];//记录每一个字符的编码 }*huffmannodetree; typedef struct countfreqnode { char nm; int freq; countfreqnode* next; }*countfrelist; //统计文件中,每个字符出现的频率 countfrelist & counthelp(char *filename){ countfrelist L; countfreqnode *pt; char a; ifstream infile; L = new countfreqnode; //统计数据存入链表中,头结点 L->next = nullptr; infile.open(filename, ios::in | ios::_Nocreate); //打开须统计的字符文件 if (!infile) //判断打开是否正常 { cout << "文件" << filename << "打开失败!" << endl; exit(1); } while (infile.get(a)) //一个一个读入字符,直到文件尾 { pt = L->next; while (pt != nullptr) { if (pt->nm == a) //如果当前结点符号与读入符号相同,累积出现的次数 { pt->freq++; break; } pt = pt->next; } if (pt == nullptr) //属于新出现的符号,建立新结点,保存其出现频率 { pt = new countfreqnode; pt->next = nullptr; L->next = pt; pt->nm = a; pt->freq = 1; } cout << a; } cout << endl; pt = L->next; //输出每个符号出现的频率 cout << setw(10) << "符号" << setw(10) << "频率" << endl; while ( pt!=nullptr ) { cout << setw(10) << pt->nm << setw(10) << pt->freq << endl; pt = pt->next; } infile.close(); return L; //返回保存每个符号出现频率的链表指针 } //获取链表的长度 int ListLength(countfrelist L) { if (L->next == NULL) return 0; int length = 0; countfreqnode *p = L->next; while (p->next != NULL) { p = p->next; length++; } return length; } //选择数组中最小的两个元素 void selecttwomin(huffmannode* &HT, int len, int &s1, int &s2) { int i; for (i = 0; i <=len && HT[i].parent != 0; i++); s1 = i; for (i = 0; i <= len; i++) if (HT[i].parent == 0 && HT[i].weight<HT[s1].weight) s1 = i; for (i = 0; i <= len; i++) if (HT[i].parent == 0 && i != s1) break; s2 = i; for (i = 0; i <= len; i++) if (HT[i].parent == 0 && i != s1 && HT[i].weight<HT[s2].weight) s2 = i; } //构建Huffman树并且获取编码 huffmannodetree huffmantree(countfrelist &tm, int l){ int n,i,fmin,smin; countfreqnode*p; n = 2 * l - 1; huffmannodetree ht = new huffmannode[n]; p =tm->next; //将链表中的数据转移到数组中来 for (i = 0; i < l && p!=NULL; ++i,p=p->next) { ht[i].weight = p->freq; ht[i].ch = p->nm; ht[i].parent = ht[i].lchild = ht[i].rchild = 0; } for (; i < n; ++i) { ht[i].weight = 0; ht[i].ch = '\0'; ht[i].parent = ht[i].lchild = ht[i].rchild = 0; } //建造huffman树 for (i = l; i <n; ++i) { selecttwomin(ht, i-1, fmin, smin); ht[fmin].parent = i; ht[smin].parent = i; ht[i].lchild = fmin; ht[i].rchild = smin; ht[i].weight = ht[fmin].weight + ht[smin].weight; } //获取编码 for (i = 0; i < l; ++i) { int start = l - 1; ht[i].code[start] = '\0'; int c, f; for (c = i, f = ht[i].parent; f != 0; c = f, f = ht[f].parent) { if (ht[f].lchild == c) ht[i].code[--start] = '0'; else ht[i].code[--start] = '1'; } ht[i].index = start; } return ht; } //译码 void decode(huffmannodetree & ht,int l){ char infilename[20]; char outfilename[20]; char a_code[20] = ""; ifstream infile; char a; int c=0; cout << "input the filename which translate" << endl; cin >> infilename; infile.open(infilename, ios::in | ios::_Nocreate); if (!infile) { cout << "文件" << infilename << "打开失败!" << endl; exit(1); } ofstream outfile; strcat_s(outfilename, infilename); outfile.open(outfilename, ios::out); if (!outfile) { cout << "文件" << outfilename << "打开失败!" << endl; exit(1); } while (infile.get(a)) { if ('0' == a) strcat_s(a_code, "0"); else strcat_s(a_code, "1"); while (c < l) { if (0 == strcmp(a_code, &ht[c].code[ht[c].index])) { outfile << ht[c].ch; strcpy_s(a_code, ""); break; } else c++; } } } int _tmain(int argc, _TCHAR* argv[]) { char filename[30]; int len; countfrelist L; huffmannodetree ht; cout << "请输入待统计的文件名:"; cin >> filename; L = counthelp(filename); len = ListLength(L); ht = huffmantree(L, len); decode(ht, len); system("pause"); return 0; } ```
将类中的成员函数写出来后,报错:本地函数非法
#include<iostream> #include<string> #include<fstream> #include<stdlib.h> #include<iomanip> #include<cstdlib> using namespace std; class Student{ private: string name[10];//姓名 int number;//学号 int age;//年龄 char xingbie;// 性别 char banji;//班级 string birthday;//出生年月 string dizhi;//地址 string phone;//电话 string mail;//E-mail double cpro,english,math,sport,java,allscore,average;//课程 public: Student(); char choose(); void input(); void add(); void change(); void delete1(); void findname(); void findnumber(); void output(); void order(); void save(); }; char choose() { system("cls"); cout<<"**************欢迎使用学生管理系统**************"<<endl; cout<<"==========================================="<<endl; cout<<" **** 学生成绩管理系统 **** " <<endl; cout<<"==========================================="<<endl; cout<<" ★ ☆\t ******** 0、输入学生信息 ********\t☆ ★"<<endl; cout<<" ★ ☆\t ******** 1、增加学生信息 ********\t☆ ★"<<endl; cout<<" ★ ☆\t ******** 2、修改学生信息 ********\t☆ ★"<<endl; cout<<" ★ ☆\t ******** 3、删除学生信息 ********\t☆ ★"<<endl; cout<<" ★ ☆\t ******** 4、按姓名查询 ********\t☆ ★"<<endl; cout<<" ★ ☆\t ******** 5、按学号查询 ********\t☆ ★"<<endl; cout<<" ★ ☆\t ******** 6、输出所有学生成绩 ****\t☆ ★"<<endl; cout<<" ★ ☆\t ******** 7、按总分高低排序 ******\t☆ ★"<<endl; cout<<" ★ ☆\t ******** 8、保存文件 ********\t☆ ★"<<endl; cout<<" ★ ☆\t ******** 9、退出系统 ********\t☆ ★"<<endl; cout<<"============================================"<<endl; cout<<" 选择0-9数字进行操作 "<<endl; cout<<"================制作人:liubo================="<<endl; char choose; cin>>choose; return choose; } void main() { Student v; // char choose=v.choose(); while(choose=v.choose()) Student s[50];//指针对象,最多存50个学生数据 ofstream *file[50]; //负责对文件插入操作 int i=0; int j=0; //int flag=0;//flag判断输入是否有效 //do { //cin>>p; //if((p>='0'&&p<='9')) //flag=1; //else // cout<<" 指令错误!请重新输入:"<<endl; //}while(flag==0); //do{ switch(choose) //接收功能选项 { case '0': v.input(); break; case '1': v.add(); break; case '2': v.change(); break; case '3': v.delete1(); break; case '4': v.findname(); break; case '5': v.findnumber(); break; case '6': v.output(); break; case '7': v.order(); break; case '8': v.save(); break; case '9': default:cout<<"错误"<<endl; break; } void Student::input() { char c; string name;//姓名 string number;//学号 int age;//年龄 char xingbie[8];// 性别 char banji[4];//班级 string birthday;//出生年月 string dizhi;//地址 string phone;//电话 string mail;//E-mail double cpro,english,math,sport,java,allscore,average;//课程 do{ cout<<endl<<" 姓名:"; cin>>name; cout<<endl<<" 学号:"; cin>>number; cout<<endl<<" 年龄:"; cin>>age; cout<<endl<<" 性别 :"; cin>>xingbie; cout<<endl<<" 班级:"; cin>>banji; cout<<endl<<"出生年月:"; cin>>birthday; cout<<endl<<"地址:"; cin>>dizhi; cout<<endl<<"电话:"; cin>>phone; cout<<endl<<"E-mail:"; cin>>mail; cout<<endl<<" C++成绩:"; cin>>cpro; cout<<endl<<" 英语成绩:"; cin>>english; cout<<endl<<" 高数成绩:"; cin>>math; cout<<endl<<" 体育成绩:"; cin>>sport; cout<<endl<<" JAVA成绩:"; cin>>java; cout<<endl; allscore=cpro+english+math+sport+java; cout<<" 总成绩:"<<allscore<<endl; average=(cpro+english+math+sport+java)/5; cout<<" 平均成绩:"<<average<<endl; file[j]=new ofstream("D:\Student.txt",ios::ate); *file[j]<<"姓名"<<name<<"学号"<<number<<"年龄"<<age<<"性别"<<xingbie<<"班级"<<banji<<"出生年月"<<birthday <<"地址"<<dizhi<<"电话"<<phone<<"E-mail"<<mail<<" C++成绩 "<<cpro<<" 英语成绩 "<<english<<" 高数成绩 " <<math<<" 体育成绩 "<<sport<<" JAVA成绩"<<java<<"总成绩"<<allscore<<"平均成绩"<<average<<endl; j++; s[i]= Student(name, number,age,xingbie,banji,birthday,dizhi,phone,mail,cpro,english,math,sport,java,allscore,average); i++; cout<<" 数据输入成功,想继续输入吗(y/n):"; cin>>c; cout<<endl; if(c!='y'&&c!='n') { cout<<" 指令错误!请重新输入!"<<endl<<" "; cin>>c; } else flag=1; }while(c=='y'); break; } void Student::add(){ int number; double cpro,english,math,sport,java; char c; do { cout<<" 请输入您要增加的学生的姓名:"; cin>>name; cout<<endl<<"请输入您要增加的学生的学号:"; cin>>number; cout<<endl<<"请输入您要增加的学生的年龄:"; cin>>age; cout<<endl<<"请输入您要增加的学生的性别 :"; cin>>xingbie; cout<<endl<<"请输入您要增加的学生的班级:"; cin>>banji; cout<<endl<<"请输入您要增加的学生的出生年月:"; cin>>birthday; cout<<endl<<"请输入您要增加的学生的地址:"; cin>>dizhi; cout<<endl<<"请输入您要增加的学生的电话:"; cin>>phone; cout<<endl<<"请输入您要增加的学生的E-mail:"; cin>>mail; cout<<endl<<"请输入您要增加的学生的 C++成绩:"; cin>>cpro; cout<<endl<<" 请输入您要增加的学生的英语成绩:"; cin>>english; cout<<endl<<" 请输入您要增加的学生的高数成绩:"; cin>>math; cout<<endl<<" 请输入您要增加的学生的体育成绩:"; cin>>sport; cout<<endl<<" 请输入您要增加的学生的JAVA成绩:"; cin>>java; cout<<endl; {allscore=cpro+english+math+sport+java;} cout<<" 总成绩:"<<allscore<<endl; {average=(cpro+english+math+sport+java)/5;} cout<<" 平均成绩:"<<average<<endl; file[j]=new ofstream("d:\student.dat",ios::ate); *file[j]<<" 姓名 "<<name<<" 学号 "<<number << " C++成绩 "<<cpro<<" 英语成绩 "<<english<<" 高数成绩 " <<math<<" 体育成绩 "<<sport<<" JAVA成绩 "<<java <<" 总成绩 "<<allscore<<" 平均成绩 "<<average<<endl; j++; s[i]= student(name, number,cpro,english,math,sport,java,allscore,average); i++; cout<<" 数据输入成功,想继续数入吗(y/n):"; cin>>c; cout<<endl; if(c!='y'&&c!='n') { cout<<" 指令错误!请重新输入!"<<endl<<" "; cin>>c; } }while(c=='y'); break; } void Student::change(){ string na; int nu; double cc,eng,ma,sp,jav,as,av;flag=0; char c; if(i==0) { cout<<"系统中找不到这个学生"; } do { cout<<" 请输入您要修改的学生的姓名:"; cin>>name; cout<<endl; for(int h=0;h<i;h++) //h纪录要修改学生的位置 { if(strcmp(name,s[h].name)==0) { flag=1; cout<<" 新的学号:"; cin>>nu; cout<<endl<<" C++成绩:"; cin>>cc; cout<<endl<<" 英语成绩:"; cin>>eng; cout<<endl<<" 高数成绩:"; cin>>ma; cout<<endl<<" 体育成绩:"; cin>>sp; cout<<endl<<" JAVA成绩:"; cin>>jav; {as=cc+eng+ma+sp+jav;} cout<<endl<<" 总成绩:"<<as; {av=as/5;} cout<<endl<<" 平均成绩:"<<av; cout<<endl; s[h].cpro=cc; s[h].english=eng; s[h].math=ma; s[h].sport=sp; s[h].number=nu; cout<<" 数据修改成功!"<<endl; } } if(flag==0) { cout<<" 您要修改的学生本来就不存在!请检查重新输入!"<<endl; } cout<<" 想继续修改吗(y/n):"; cin>>c; cout<<endl; if(c!='y'&&c!='n') { cout<<" 指令错误!请重新输入!"<<endl<<" "; cin>>c; } }while(c=='y'); break; } void Student::delete1(){ cout<<" 请输入你要删除的姓名 :"; char m[20]; cin>>m; for(int a=0;a<i;a++) { if(strcmp(s[a].name,m)==0) { int w; w=a; for(w;w<i;w++) { s[w]=s[w+1]; i=i-1;} cout<<" 删除成功!"<<endl; } } break; } void Student::findname(){ char n[20];int j=0;char c; if(i==0) { cout<<" 管理系统中没有输入数据!"<<endl;break; } do{ int flag=0; cout<<" 请输入你要查询的学生姓名:"; cin>>n; cout<<endl; for(int j=0;j<i;j++) { if(strcmp(n,(s[j]).name)==0) { flag=1; cout<<" 您要查询的学生是:"<<(s[j]).name<<endl; cout<<(s[j]).name<<"的成绩是: "<<" C++: "<<(s[j]).cpro<<" 英语: "<<(s[j]).english<<" 高数:"<<(s[j]).math<<" 体育:"<<(s[j]).sport <<" JAVA"<<(s[j]).java<<" 总成绩"<<(s[j]).allscore<<" 平均成绩"<<(s[j]).average<<endl; } } if(flag==0) cout<<" 对不起!您要查询的学生不存在!"<<endl; cout<<" 您想继续查询吗?(y/n):"; cin>>c; cout<<endl; if(c!='y'&&c!='n') { cout<<" 指令错误!请重新输入!"<<endl; cin>>c; } } while(c=='y'); break; } void Student::findnumber(){ int n,j=0; char c; if(i==0){ cout<<" 管理系统中没有输入数据!"<<endl;break; } do{ int flag=0; cout<<" 请输入你要查询的学生的学号:"; cin>>n; cout<<endl; for(int j=0;j<i;j++) { if(s[j].number==n) { flag=1; cout<<" 您要查询的学生是:"<<(s[j]).name<<endl; cout<<(s[j]).name<<"的成绩是: "<<" C++:"<<(s[j]).cpro<<" 英语:"<<(s[j]).english<<" 高数:"<<(s[j]).math<<" 体育:"<<(s[j]).sport<<" JAVA: "<<(s[j]).java<<"总成绩:"<<(s[j]).allscore<<"平均成绩:"<<(s[j]).average<<endl; } } if(flag==0) cout<<" 对不起!您要查询的学生不存在!"<<endl; cout<<" 您想继续查询吗?(y/n):"; cin>>c; cout<<endl; if(c!='y'&&c!='n') { cout<<" 指令错误!请重新输入!"<<endl; cin>>c; } } while(c=='y'); break; } void Student::output(){ cout<<" 本系统所有学生数据如下:"<<endl; if(i==0) cout<<" 管理系统中没有输入数据!"<<endl; cout<<"姓名 学号 年龄 性别 班级 出生年月 地址 电话 E-mail c++ 英语 高数 体育 JAVA 总成绩 平均成绩 "<<endl; for(int k=0;k<i;k++) { cout<<s[k].name<<setw(7) <<s[k].number<<setw(4) <<s[k].age<<setw(5) <<s[k].xingbie<<setw(4) <<s[k].banji<<setw(6) <<s[k].birthday<<setw(7) <<s[k].dizhi<<setw(8) <<s[k].phone<<setw(11) <<s[k].E-mail<<setw(12) <<(s[k]).cpro<<setw(5) <<(s[k]).english<<setw(5) <<(s[k]).math<<setw(4) <<(s[k]).sport<<setw(5) <<(s[k]).java<<setw(6) <<s[k].allscore<<setw(10) <<(s[k]).average<<setw(7)<<endl; } break; } void Student::order(){ student temp; for(int t=0;t<i;t++) for(int k=t+1;k<i;k++) while (s[t].allscore<s[k].allscore) { temp=s[t]; s[t]=s[k]; s[k]=temp; } cout<<"已经排好序了,是否需要输出(y/n):"; char yn; cin>>yn; while(yn!='y'&&yn!='n') { cout<<"操作错误!!!请重新输入:"; cin>>yn; } if(yn=='y') { cout<<"所有学生的成绩按总分从高到低的排名是:"<<endl; cout<<" 本系统所有学生数据如下:"<<endl; if(i==0) cout<<" 管理系统中没有输入数据!"<<endl; cout<<"姓名 学号 c++ 英语 高数 体育 JAVA 总成绩 平均成绩 "<<endl; for(int k=0;k<i;k++) { Student s[50]; cout<<s[k].name<<setw(7) <<s[k].number<<setw(4) <<s[k].age<<setw(5) <<s[k].xingbie<<setw(4) <<s[k].banji<<setw(6) <<s[k].birthday<<setw(7) <<s[k].dizhi<<setw(8) <<s[k].phone<<setw(11) <<s[k].E-mail<<setw(12) <<(s[k]).cpro<<setw(5) <<(s[k]).english<<setw(5) <<(s[k]).math<<setw(4) <<(s[k]).sport<<setw(5) <<(s[k]).java<<setw(6) <<s[k].allscore<<setw(10) <<(s[k]).average<<setw(7)<<endl; } } break; } void Student::save(){ cout<<" 保存成功!"<<endl;break; }
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
剑指Offer对答如流系列 - 重建二叉树
面试题6:重建二叉树 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出图2.6所示的二叉树并输出它的头结点。二叉树结点的定义如下: class TreeNode{ int val; TreeNode l...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
一份王者荣耀的英雄数据报告
咪哥杂谈本篇阅读时间约为 6 分钟。1前言前一阵写了关于王者的一些系列文章,从数据的获取到数据清洗,数据落地,都是为了本篇的铺垫。今天来实现一下,看看不同维度得到的结论。2环境准备本次实...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
为什么程序猿都不愿意去外包?
分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助
Java校招入职华为,半年后我跑路了
何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...
立即提问