在本例中,如何在编译时从文本文件读取数据
How to read data from a text file at compile time in this case?
我知道问题的标题可能使它看起来是一个重复的问题,但事实并非如此。我已经尝试了几乎所有的解决方案在这里给出的stackoverflow. A方法读取数据的文件在编译时把它放在应用程序图像文件的某个地方初始化数组。
我的问题是我正在使用c++代码,我正在使用一些开放的cv库和函数。我有一个主函数osimain。cpp它的代码为
我的代码:
int main (int argc, char * argv[])
{
try
{
OsiManager osi ;
osi.loadConfiguration(argv[1]) ;
osi.showConfiguration() ;
osi.run() ;
}
catch ( std::exception & e )
{
std::cout << e.what() << std::endl ;
}
return 0 ;
OsiManager是另一个类。这个类管理所有的文件、配置、保存和加载选项。它使用OsiEye类来执行技术处理。在OsiManager构造函数中,我们初始化了代码需要的一些参数的值。下面给出了OsiManager代码的构造函数部分
// Default constructor
OsiManager::OsiManager ( )
{
mMapInt["Minimum diameter for pupil"] = &mMinPupilDiameter ;
mMapInt["Maximum diameter for pupil"] = &mMaxPupilDiameter ;
mMapInt["Minimum diameter for iris"] = &mMinIrisDiameter ;
mMapInt["Maximum diameter for iris"] = &mMaxIrisDiameter ;
mMapInt["Width of normalized image"] = &mWidthOfNormalizedIris ;
mMapInt["Height of normalized image"] = &mHeightOfNormalizedIris ;
mMapString["Gabor filters"] = &mFilenameGaborFilters ;
mMapString["Application points"] = &mFilenameApplicationPoints ;
// Initialize all parameters
initConfiguration() ;
}
void OsiManager::initConfiguration ( )
{
mMinPupilDiameter = 50;
mMaxPupilDiameter = 160;
mMinIrisDiameter = 160;
mMaxIrisDiameter = 280;
mWidthOfNormalizedIris = 512;
mHeightOfNormalizedIris = 64;
mFilenameGaborFilters = "/home/Iris_Osiris_v4.1/OsirisParam/filters.txt" ;
mFilenameApplicationPoints = "/home/Iris_Osiris_v4.1/OsirisParam/points.txt" ;
mGaborFilters.clear();
mpApplicationPoints = 0 ;
}
这些值在构造函数中被初始化。在函数initconfiguration中,我们可以看到两个文件路径mfilenameGaborFilter和mfilenameApplication点。这些给出了两个文件名的路径。这些文件基本上都是巨大的矩阵,比如9乘15,9乘25。这些矩阵被读入变量mGaborFilters和mpApplicationPoints,它们分别是矢量CvMat*和CvMat*类型。用于将这些文件读入变量的函数如下所示,分别为loadGaborFilters和loadApplicationPoints。
void OsiManager::loadGaborFilters( )
{
// Open text file containing the filters
ifstream file(mFilenameGaborFilters.c_str(),ios::in) ;
if ( ! file )
{
throw runtime_error("Cannot load Gabor filters in file " + mFilenameGaborFilters) ;
}
// Get the number of filters
int n_filters ;
file >> n_filters ;
mGaborFilters.resize(n_filters) ;
// Size of filter
int rows , cols ;
// Loop on each filter
for ( int f = 0 ; f < n_filters ; f++ )
{
// Get the size of the filter
file >> rows ;
file >> cols ;
// Temporary filter. Will be destroyed at the end of loop
mGaborFilters[f] = cvCreateMat(rows,cols,CV_32FC1) ;
// Set the value at coordinates r,c
for ( int r = 0 ; r < rows ; r++ )
{
for ( int c = 0 ; c < cols ; c++ )
{
file >> mGaborFilters[f]->data.fl[r*cols+c] ;
}
}
} // Loop on each filter
// Close the file
file.close() ;
} // end of function
// Load the application points (build a binary matrix) from a textfile
void OsiManager::loadApplicationPoints ( )
{
// Open text file containing the filters
ifstream file(mFilenameApplicationPoints.c_str(),ios::in) ;
if ( ! file )
{
throw runtime_error("Cannot load the application points in " + mFilenameApplicationPoints) ;
}
// Get the number of points
int n_points = 0 ;
file >> n_points ;
// Allocate memory for the matrix containing the points
mpApplicationPoints = cvCreateMat(mHeightOfNormalizedIris,mWidthOfNormalizedIris,CV_8UC1) ;
// Initialize all pixels to "off"
cvSet(mpApplicationPoints,cvScalar(0)) ;
// Local variables
int i , j ;
// Loop on each point
for ( int p = 0 ; p < n_points ; p++ )
{
// Get the coordinates
file >> i ; file >> j ;
// Set pixel to "on"
if ( i < 0 || i > mpApplicationPoints->rows-1 || j < 0 || j > mpApplicationPoints->cols-1 )
{
cout << "Point (" << i << "," << j << ") " ;
cout << "exceeds size of normalized image : " ;
cout << mpApplicationPoints->rows << "x" << mpApplicationPoints->cols ;
cout << " while loading application points" << endl ;
}
else
{
mpApplicationPoints->data.ptr[(i)*mpApplicationPoints->cols+j] = 255 ;
}
}
// Close the file
file.close() ;
} // end of function
以上两个函数是在主函数中调用的OsiManager类的成员函数loadConfiguration的一部分。
我的问题是我希望这些文件Gabor过滤器和应用程序点在编译时被读取到变量中,因为我们不想将这些文件与可执行文件或构建一起上传到集群。
你不能在编译时做运行时文件IO,但因为源数据只是文本,你可以用这些文件的内容初始化一个const char*
字符串(很容易用c++ 11原始字符串文字和复制粘贴),并替换ifstream
在你的init函数与std::stringstream
初始化你的字符串文字
- 文本文件中的单词链表
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 如何将内容数组写入文本文件?
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- C++将文本文件中的数据读取到结构数组中
- 在指针的帮助下,文本文件中单词的频率
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将值从二维数组输出到文本文件
- 如何在c++中从文本文件中逐行读取整数
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- C++试图读取一个文件并输出到另一个文本文件
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 已修改的LinkedList未在文本文件本身中更新
- C++文本文件的获取线
- 为什么C++的文件 I/O 在读取文本文件时忽略初始空行?我怎样才能让它不这样做?
- 打印逐行存储的文本文件
- C++文本文件输入