Разобрать содержимое String Array C ++ - PullRequest
1 голос
/ 23 января 2009

Я прочитал файл и сохранил его содержимое в строковом массиве.

Мне нужно изменить некоторые числовые значения, интерпретируемые компилятором как символы.

Файл имеет формат: ABCDE, EFGHIJ KLMNOPQRS, 45.58867,122.59750

Я искал и учился, но не нашел ничего слишком всеобъемлющего.

Если кто-нибудь может подсказать, как это сделать, я был бы очень рад.

И мне не разрешено использовать strtod; Я думаю, что это функция C, и моя программа должна быть строго C ++.

Вот мой код, который я разработал до сих пор:

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


using namespace std;


int main()
{

    string usrFileStr,
    fileStr = "airNames.txt",  // declaring an obj string literal
    sBuffer,
    sLine = "";

    istringstream iStrStrm;

    int lineCount = 1;
    int nStart;


    fstream inFile;                  // declaring a fstream obj
    // cout is the name of the output stream
    cout << "Enter a file: ";
    cin >> usrFileStr;


    inFile.open( usrFileStr.c_str(), ios::in ); 
    // at this point the file is open and we may parse the contents of it


    while ( getline ( inFile, sBuffer ) && !inFile.eof() )
    {
          nStart = -1 ;
          cout << "First Str " << lineCount << " (";
          for ( int x = nStart + 1; x < sBuffer.length(); x++ )
          {
              if ( sBuffer[ x ] == ',' )
              {
                   nStart = x;
                   break;
                   }
              cout << sBuffer[ x ];


          }
          cout << ") ";
          for ( int x = nStart + 1; x < sBuffer.length(); x++ )
          {

              if ( sBuffer[ x ] == ',' )
              {    
                   nStart = x;
                   break;
                   }
              cout << sBuffer[ x ];
          }
          cout << " (Second Str: "; // lattitude loop


          for ( int x = nStart + 1; x < sBuffer.length(); x++ )
          {
              if ( sBuffer[ x ] == ',' )
              {
                   nStart = x;
                   break;
                   }
              cout << sBuffer[ x ];         
          }

          cout << ", Third String: ";
          for ( int x = nStart + 1; x < sBuffer.length(); x++ )
          {
              if ( sBuffer[ x ] == ',' )
              {
                   nStart = x;
                   break;
                   }
              cout << sBuffer[ x ];
          }
          cout << ") \n";
          lineCount++;
    }


    cout << "There are a Total of: " <<  lineCount << " line(s) in the file."
    << endl;


    inFile.clear();           // clear the file of any errors
    inFile.close();  // at this point we are done with the file and may close it

    fgetc( stdin );
    return 0;
}

Я пытался прочитать только две цифры после десятичной точки, но я получил только один символ. Моя первая попытка была с static_cast, но это было далеко. И переменная istringstream не допустит, чтобы ее аргумент был массивом. Я не знаю, что делать ..

Ответы [ 5 ]

3 голосов
/ 23 января 2009

std::stringstream

Учись любить это. Не istringstream, так как вы хотите получить выход из него. Что-то вроде:

getline ( inFile, sBuffer );
stringstream myStream(sBuffer);
string first, second, third;
char comma;

myStream >> first;  
myStream >> second;
myStream >> third;

float value1, value2;
myStream >> value1;
myStream >> value2;

Также я бы посоветовал вам проверить, действительно ли файл открывается.

1 голос
/ 23 января 2009

Вы хотите stringstream, как предложено, но ...

Кроме того, глупо пренебрегать функциями C в контексте программы на C ++. Большинство функций ОС будут экспортироваться как функции C, а сам C ++, как правило (всегда?), В любом случае компилируется до эквивалента кода C, так что ничто, что прилипает только к конструкциям / функциям C ++, не покупает вас. В любом случае используйте абстракции и методологии более высокого уровня, предоставляемые C ++, когда это уместно, но если вы пытаетесь избежать всех функций C-linkage, вы причиняете себе вред без всякой уважительной причины. Используйте то, что работает; Реальное программирование достаточно сложно, без преодоления добровольных ограничений.

Конечно, вышесказанное применимо только к программированию в реальном мире; домашние задания и тому подобное могут быть исключением. :)

0 голосов
/ 23 января 2009

Use Boost Spirit (http://www.boost.org/doc/libs/1_37_0/libs/spirit/classic/index.html). Требуется время, чтобы привыкнуть, но очень мощный и полезный, если вы узнаете его.

0 голосов
/ 23 января 2009

Использование string.find () может избавить от некоторых ваших циклов (возможно, они просто выполняют их внутренне, но не нужно заново изобретать колесо). Вы можете использовать поток строк, чтобы преобразовать числовые строки в числа с плавающей запятой или двойные числа.

0 голосов
/ 23 января 2009

Вы также можете попробовать использовать регулярное выражение, Смотри: http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/boost_regex/captures.html

Таким образом, вы можете добавить reqex для символа ',' и захватить значения внутри, даже проверить их, может быть ...

Удачи!

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