ifstream 在读取文件 3 次后中断

Posted

技术标签:

【中文标题】ifstream 在读取文件 3 次后中断【英文标题】:ifstream breaks after reading a file 3 times 【发布时间】:2012-12-13 00:07:52 【问题描述】:

我正在使用 ifstream 从 .txt 文件中获取值。我还使用windows 库来读取文件夹中的所有文件,即循环直到到达文件夹末尾。在这个循环中,我从一个 txt 文件中读取值并使用 push_back 将其添加到矩阵中。

这是有问题的代码部分:

Mat trainme(0, dictionarySize, CV_32FC1); 
Mat labels(0, 1, CV_32FC1); //1d matrix with 32fc1 is requirement of normalbayesclassifier class



hTrain = FindFirstFile(full_path, &TrainData);
if (hTrain != INVALID_HANDLE_VALUE)


    ifstream file("c:\\222\\labels.txt");
    string line;

    do 

        strcpy(loc,DirSpec);

        Mat img = imread(strcat(loc,TrainData.cFileName), 0);
        cout<<"Processing file:  "<<TrainData.cFileName<<endl;

        if (!img.data)
        cout << "Image data not loaded properly:  " <<TrainData.cFileName<< endl;
        cin.get();
        
        vector<KeyPoint> keypoints;
        features->detect(img, keypoints);
        if(keypoints.empty()) cout<<"Cannot find keypoints in image:  "<<TrainData.cFileName<<endl;
        Mat bowDescriptor;
        bowDE.compute(img, keypoints, bowDescriptor);
        trainme.push_back(bowDescriptor);
        getline(file, line);

        labels.push_back(line);

        strcpy(loc,"");
         while( FindNextFile(hTrain,&TrainData));

问题出现在labels.push_back(line); 3 次循环之后。我的意思是文件被读取了 3 次,然后出现错误:Access violation writing location。并指向memcpy.asm中的这一行:

    mov     [edi],al        ;U - put byte in destination

我无法弄清楚它为什么会失败。我认为传输string 格式可能有问题,所以我使用了float value = atof(line),但它给出了一个错误,它无法从字符串格式转换,它只能采用旧的c 样式字符串。

这是 labels.txt 中包含的内容

1
2
2
2
1
2
2
2

感谢您的关注。

更新:我尝试将文件读取移出主循环并使用 while(file.good()) 但我仍然在同一个位置遇到相同的错误。我不知道为什么。

string line;
ifstream file("c:\\222\\labels.txt");
if (file.is_open())

    while (file.good() )
    
    getline (file,line);
    labels.push_back(line);
    
    file.close();

【问题讨论】:

类型Mat的定义是什么? @phonetagger 是opencv的一个函数,如cv::Mat 【参考方案1】:

好吧,我设法解决了... =/

问题出在这里:labels.push_back(line);

我认为使用 push_backstd::string 添加到 Mat 是不可能的。

我通过使用atof 将字符串转换为浮点数来解决它。

getline (file,line);
float label = atof(line.c_str());
labels.push_back(label);

【讨论】:

以上是关于ifstream 在读取文件 3 次后中断的主要内容,如果未能解决你的问题,请参考以下文章

C++中,ifstream和ofstream定义文件流的区别

使用 ifstream 从二进制文件中读取 4 个字节

c++中ifstream一次读取整个文件

c++中ifstream一次读取整个文件

c++中ifstream一次读取整个文件

C++,读取二进制 ifstream 时的奇怪行为