2013-10-01 2 views
0

Я ищу свою проблему, но не нашел ответа. Я пытаюсь прочитать таблицу двойных значений из файла в 2d-массив двойников в C++, но я не могу заставить его работать.Не удается заполнить 2d-массив с помощью sscanf_s из файла

Файл полон другого мусора, который мне не нужен, и таблица заключена в скобки «НАЧАЛО ТАБЛИЦЫ» и «КОНЕЦ ТАБЛИЦА». Таблица имеет 5 удвоений в строке с разделителем пространства и неизвестным количеством строк. Таким образом, файл выглядит следующим образом

junk 
. 
. 
. 
BEGIN TABLE 
0.12145 0.23234 2.32423 1.32422 0.12345 
1.34534 1.23423 5.21323 3.12313 1.22231 
. 
. 
. 
2.32422 3.23423 1.12345 4.34532 2.23423 
END TABLE 

Так первый я иду через файл, поиск начала и конца таблицы и выделить память для моего массива:

char sBuffer[100]; 
double** darrTable; 
int iRes = -1; 

    iRes = fopen_s(&pFile, strFile, "rb"); 
    if (iRes==0) 
    { 
     int ilines = 0; 
     bool beof = false; 
     bool bfound = false; 
     //get number of lines for array allocation 
     while(!beof) 
     { 

      fgets(sBuffer,100,pFile);     
      if(strstr(sBuffer,"END TABLE")) 
      { 
       bfound = false; 
       beof = true; 
      } 
      if(bfound) ilines++; 
      if(strstr(sBuffer,"BEGIN TABLE"))bfound = true; 
     } 
     darrTable = new double*[ilines+1]; 
     for(int i = 0; i < (ilines+1); ++i) darrTable [i] = new double[5]; 
    } 

в другом блоке кода Поеду через снова линии и хочет считывание строки, но он не будет работать

int ilines = 0; 
bool beof = false; 
bool bfound = false; 
while(!beof) 
      { 
       fgets(sBuffer,100,pFile);     
       if(strstr(sBuffer,"END TABLE")) 
       { 
        bfound = false; 
        beof = true; 
       } 
       if(bfound) 
       { 
        sscanf_s(sBuffer,"%d %d %d %d %d",&darrTable [ilines][0],&darrTable [ilines][1],&darrTable [ilines][2],&darrTable [ilines][3],&darrTable [ilines][4]); 

        ilines++; 
       } 
       if(strstr(sBuffer,"BEGIN TABLE"))bfound = true; 

      } 

компилируется и выполняется без ошибок, но все, что я получаю массив полного 0.000000000 для darrTable. sscanf_s returs 1 witch предлагает, чтобы было найдено 1 значение, но все значения равны 0.

Я использую VisualStudio 2005 SP0.

Извините за мой английский и спасибо за вашу помощь заранее.

+1

Используйте '% f' или'% lf' вместо '% d'. Вы пытаетесь рассматривать значения 'float' как' int'. –

ответ

0

Использование C++ стиль

#include <vector> 
#include <string> 
#include <iostream> 
#include <sstream> 
#include <fstream> 

std::vector<std::vector<double>> ParseFile(const std::string& filename) 
{ 
    std::vector<std::vector<double>> data; 

    std::ifstream file(filename.c_str()); 
    std::string line; 

    while (std::getline(file, line)) 
    { 
     if (line == "BEGIN TABLE") 
     { 
      while (std::getline(file, line)) 
      { 
       if (line == "END TABLE") 
       { 
        break; 
       } 
       else 
       { 
        data.push_back(std::vector<double>()); 
        std::istringstream ss(line); 
        double temp; 
        while (ss >> temp) 
        { 
         data.back().push_back(temp); 
        } 

        if (data.back().size() != 5) 
        { 
         // missing or extra data 
        } 
       } 
      } 
      break; // END TABLE missing 
     } 
    } 

    if (data.empty()) 
    { 
     // BEGIN TABLE missing or there was no data lines 
    } 

    return data; 
} 
+0

Wow спасибо за быстрый ответ, он отлично работает. До сих пор я не работал с векторами. Что делает строка 'data.push_back (std :: vector ());' do? Добавляет ли он «строку»? – TBuc

+0

Да. Нет 2d-вектора, поэтому вам нужно создать вектор векторов, аналогичный вашему массиву массивов. Доступ к данным [y] [x] или данным [строка] [col]. Эта строка добавляет пустой вектор строки в верхний вектор векторов строк. back() получает последний вектор строки, который мы просто вставляем, и добавляет данные столбца. –

+0

Большое вам спасибо. Вы избавили меня от многих разочарований. – TBuc

Смежные вопросы