Прочитайте текстовый файл в C ++ - PullRequest
0 голосов
/ 10 января 2012

Я работаю в Ubuntu на OpenCV.Я пытаюсь прочитать текстовый файл, который содержит числа, но я продолжаю получать значения мусора, и одно и то же значение повторяется каждый раз, когда функция зацикливается.Вот эта часть кода:

FILE* fid = fopen("/trial","r");
while (fgetc(fid) != EOF)
{
    fscanf(fid, "%f", &trainsample);
    cout << trainsample << endl;
    cvSetReal2D(traindata, i, j, trainsample);
    j = j + 1;
    if (j == 6)
        i = i + 1;
}

Ответы [ 5 ]

4 голосов
/ 10 января 2012

Почему вы не используете C ++ ifstream для этой задачи?

#include <iostream>
#include <fstream>

int main(){
    std::ifstream fileStream("/trail");
    double trainsample;
    if(!fileStream.good()){
        std::cerr << "Could not open file." << std::endl;
        return 1;
    }
    while(fileStream >> trainsample){           
        std::cout << trainsample << std::endl;
    }
    if(fileStream.fail())
        std::cerr << "Input file stream error bit is set, possible read error on file." << std::endl;               
}

Если вы предпочитаете обработку файлов C, попробуйте

#include <cstdio>

int main(){
    FILE *fid = fopen("/trail","r");
    double trainsample;
    if(fid){
        while(!feof(fid)){
            fscanf(fid,"%lf",&trainsample); // Please notice "lf" when using double. Using "f" will result garbage.
            printf("%lf\n",trainsample);
        }
    }
}

См. Также cstdio и ifstream .

2 голосов
/ 10 января 2012

Есть ли какая-то особая причина, по которой вы используете процедуры ввода-вывода в стиле C вместо потоковых операторов C ++?

#include <iostream>
#include <stdexcept>
#include <fstream>
...
std::ifstream fid("/train");
if (!fid.good())
    // could not open file, panic here
else
{
  float trainsample;
  while (fid >> trainsample)
  {
    std::cout << trainsample << std::endl;
    ...
  }
  if (fid.eof())
    std::cout << "Hit end of file" << std::endl;
  else if (fid.fail())
    std::cout << "Read error on file" << std::endl;
}
2 голосов
/ 10 января 2012

fgetc () читает символ из файла.Это эквивалентно getc.Вместо этого вы можете использовать! Feof (fid) в качестве условия.Значения мусора из-за того, что вы не в правильном положении при чтении значений с плавающей точкой из файла, и в результате другие символы / специальные символы влияют на значения, считываемые C. C. 1001 *

0 голосов
/ 10 января 2012

Я предполагаю, что fopen не работает, и поэтому fscanf не работает (ничего не читает), а получаемое вами значение мусора фактически является неинициализированным содержимым переменной trainample, который, конечно, никогда не меняется.

0 голосов
/ 10 января 2012

ПРИНЯТИЕ:

  • Файл /trail содержит только одно значение с плавающей запятой на строку

С учетом вышесказанного вам не нужен цикл whileс fgetc() вместо этого вам нужно следующее

while (fscanf(fid,"%f",&trainsample) == 1) {
    cout<<trainsample<<endl;
    /* you can put all you logic here */

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...