2

次のような入力ファイルから道路データを読み込むプログラムに取り組んでいます。

INTERSECTIONS:
1   0.5 Speedway and Campbell    // intersection ID, safety rating, name
2   0.3 Park and Grant
3   0.1 Euclid and Grant

STREETS:
1   2   3            // intersection 1, intersection 2, distance in between
2   3   1
3   1   2

テーブル内の各値は、タブ (\t) 文字で区切られています

このデータを、グラフで指定された適切な変数に読み込む必要があります。私は主に簡単な答えを探しています: getline を使用して一度に 1 行を読み取り、その行をデータの各ビットに分割することは可能ですか? もしそうなら、どうすればいいですか?

メインファイルにこれまでにあるものは次のとおりです。

#include "graph.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

vector <Vertex*> vertices;
vector <Edge*> edges;

int main (int argc, char *argv[]) {

    if( argc != 4 )
    {
        std::cout << "\nUsage: " << argv[0] << " distanceInMiles startingIntersection streetMapGraphFile \n\n" << endl;
        return -1;
    }

    ifstream mapfile ("streetMapGraphFile");

    int count = 0;
    int loc = 0;

    Graph streetMap;

    if (mapfile.is_open())
    {
        while ( mapfile.good() )
        {
            while ( count != 1 ) {
                string line;
                getline(mapfile,line);
                if ( line == "INTERSECTIONS:" )
                {
                    getline(mapfile,line);
                }
                else if ( line == "" )
                {
                    count++;
                    break;  //  to avoid reading blank line line
                }
                stringstream ss(line);
                ss >> streetMap.intersection->streetID >> streetMap.intersection->safetyIndex;
                getline(ss, streetMap.intersection->name);
            }
            string line2;
            getline(mapfile,line2);
            if ( line2 == "STREETS:" )
            {
                getline(mapfile,line2);
            }
            //  TODO: Read in the edges/streets here
            stringstream ss2(line2);
            ss2 >> streetMap.street->intersection1 >> streetMap.street->intersection2 >> streetMap.street->distance;
        }
        mapfile.close();
    }
    else { cerr << "Error: unable to open file" << endl; }

    return 0;
}

行 string に stringstream を実装するようにコードを変更しましたが、段階的にデバッグすると、次の行を実行した後にコンパイラがクラッシュします。

ss >> streetMap.intersection->streetID >> streetMap.intersection->safetyIndex;

このエラーは、「safejogger.exe の 0x0F592208 (msvcp110d.dll) で未処理の例外: 0xC0000005: アクセス違反書き込み場所 0xCCCCCCCC」と表示されます。

4

1 に答える 1

1

はい、可能です。1 つの方法は、stringstream を使用することです: http://www.cplusplus.com/reference/sstream/stringstream/

例:

#include <sstream>
#include <iostream>
#include <string>

using namespace std;

template <typename T>
void getVal(stringstream &ss, T &val)
{
  string token;
  getVal(ss, token);
  stringstream ss2(token);
  ss2>>val;
}

template <>
void getVal<string>(stringstream &ss, string &val)
{
  getline(ss, val, '\t'); //Note the separator specification                                                                                                                                                                                                                                                                                                              
}

int main(int argc, char** argv)
{
  string line = "1\t2\t3";
  stringstream ss(line);
  int intersection1, intersection2, distance;
  getVal(ss, intersection1);
  getVal(ss, intersection2);
  getVal(ss, distance);
  cout<<"Distance was: "<<distance<<endl;

  string line2 = "1\t0.5\t Speedway and Campbell";
  stringstream ss2(line2);
  int intersectionID;
  float safetyRating;
  string intersectionName;
  getVal(ss2, intersectionID);
  getVal(ss2, safetyRating);
  getVal(ss2, intersectionName);
  cout<<"Intersection name: ["<<intersectionName<<"]"<<endl;

  return 0;
}
于 2012-12-05T01:40:48.023 に答える