您的位置:首页 > 编程语言 > C语言/C++

C++多个文本读取问题

2015-09-11 14:21 323 查看
同时使用两个 ifstream和 freopen 第二个就会失去效用,不知道错在了哪里!
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 );

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: