C++多个文本读取问题
同时使用两个 ifstream和 freopen 第二个就会失去效用,不知道错在了哪里!
使用C语言是注意事项,int ret = fscanf(fp,"%lf", &ViewValue); lf 和f 有何不同之处?
1. 使用freopen打开:
bool CPicToolsDlg::readTxt2Seq( std::string TxtName, std::vector<float > &Seq ) { std::string TestTxt(TxtName); // freopen(TestTxt.c_str(),"r",stdin);// 打开文件! float ViewValue; Seq.resize(0); char ch; while(std::cin ) { std::cin >> ViewValue; Seq.push_back(ViewValue); } ///fin.close(); fclose(stdin); return true; }
2. 使用C格式的fopen打开
bool CPicToolsDlg::readTxt2Seq1( std::string TxtName, std::vector<float > &Seq ) { std::string TestTxt(TxtName); // FILE *fp = NULL; if ((fp = fopen(TestTxt.c_str(), "r")) == NULL){ printf("Error in open file %s\n", TestTxt.c_str()); return false; } else{ printf(" file opened%s\n", TestTxt.c_str()); } //三元组,使用三元组逐个写入 float ViewValue; Seq.resize(0); //char Temp[100]; //if (fin.is_open() ) //{ // fin.getline(Temp,100); // int i = 0; // while(i< 100 && Temp[i] !="\0" )//寻址级别不同,到底问题出在哪里了! // { // float ViewValue(Temp[i] ); // Seq.push_back(ViewValue); // ++ i; // } //} //流出现问题 //if (fin.is_open() ) { // while( fin.get(ch) )//寻址级别不同,到底问题出在哪里了! // { // if (ch !=(int)(" ") ){ // float ViewValue(ch ); // //fin >> ViewValue; //利用 重定向输入 浮点值 // //std::cin >>ViewValue2; // //std::cin >>ViewValue3; // //P.x = ViewValue; // //P.y = ViewValue2; // //P.z = ViewValue3; // Seq.push_back(ViewValue); // } // } //} while (!feof(fp))//首先读取点云数据到点表points同时指定点对应的id: { int ret = fscanf(fp,"%f", &ViewValue); Seq.push_back(ViewValue); }//printf("%d\n", n); fclose(fp); //fin.close(); //fclose(stdin); return true; }
使用C语言是注意事项,int ret = fscanf(fp,"%lf", &ViewValue); lf 和f 有何不同之处?
3.修改后的代码,第一个使用freopen,第二个使用fopen可以正常运行了
void CPicToolsDlg::OnBnClickedButtonKmptest() { //字符串匹配 //打开目录文件 CFileDialog FileDlg( TRUE, _T("*.pcd"), NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, _T("*.txt|*.txt| *.pcd|*.pcd| All Files (*.*) |*.*||"), NULL);//选取约定! FileDlg.m_ofn.lpstrTitle = _T("打开待显示序列文本!!!"); // 打开文件对话框的标题名 if (FileDlg.DoModal() != IDOK) { MessageBox("打开文件失败!!!请重新检测", "提示", 0); return ; } CString FilePath = FileDlg.GetPathName(); std::string MyFileName = FilePath; std::vector<float > Seq(0); this->readTxt2Seq(MyFileName,Seq); CFileDialog FileDlg2( TRUE, _T("*.pcd"), NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, _T("*.txt|*.txt| *.pcd|*.pcd| All Files (*.*) |*.*||"), NULL);//选取约定! FileDlg2.m_ofn.lpstrTitle = _T("打开待显示模式文本!!!"); // 打开文件对话框的标题名 if (FileDlg2.DoModal() != IDOK) { MessageBox("打开文件失败!!!请重新检测", "提示", 0); return ; } CString FilePath2 = FileDlg2.GetPathName(); std::string MyFileName2 = FilePath2; std::vector<float > P(0); this->readTxt2Seq1(MyFileName2,P); const std::vector<float> Pattern(P); int Pos = this->Kmptest(Seq ,Pattern ); }