3

タイトルが示すように、stdin から整数の文字列を読み込んでいます。読み込もうとしているデータは、テキスト ファイルに次の形式で表示されます。

3
4
7 8 3
7 9 2
8 9 1
0 1 28
etc...    

最初の 2 行は常に 1 つの数字 (問題ありません!) で、次の行にはそれぞれ 3 つの数字があります。このファイルは stdin として私のプログラムにリダイレクトされます (myprogram < textfile)。

私は非常に多くのことを試しましたが、これをうまく行うことができませんでした! とても単純に思えますが、整数に変換する場所 (または方法) につまずきます。これが私の最新の試みです:

int main()
{

  string str, str1, str2;
  int numCities;
  int numRoads, x, y, z;
  cin >> numCities >> numRoads;

  cout << numCities << " " << numRoads << endl;
  //getline(cin, str1);


  while( getline(cin, str))
  {
    char *cstr;
    cstr = new char[str.size()+1];
    strcpy(cstr, str.c_str());

    x = atoi(strtok(cstr, " ")); //these will be stored in an array or something
    y = atoi(strtok(NULL, " ")); //but right now i just want to at least properly
    z = atoi(strtok(NULL, " ")); //store the appropriate values in these variables!


  }


 return 0;

}

atoi を使おうとすると segfault します...

前もって感謝します!

4

3 に答える 3

2

数字が予想される場所に改行があるかどうかを気にしないように入力を十分に信頼している場合は、次のようにすることができます。

int main()
{
    int numCities, numRoads;
    if (cin >> numCities >> numRoads)
    {
        int x, y, z;
        while (std::cin >> x >> y >> z)
        {
            // use the values in here...
        }
        if (!std::cin.eof())
            std::cerr << "encountered unparsable x, y and/or z before end of file\n";
    }
    else
        std::cerr << "unable to parse numCities and/or numRoads\n";
}

改行が予期された場所にない場合にエラーと説明が役立つと思われる場合(たとえば、ある行にnumCitiesとnumRoads、空白行、ある行にxy、次の行にzがある...)、次のことができます。特定の行を読み取り、値を解析します(ただし、より面倒です)。

int main()
{
    std::string line;
    int numCities, numRoads;

    if (!std::getline(line, std::cin))
        FATAL("couldn't read line on which numCities was expected");
    std::istringstream iss(line);
    char unexpected;
    if (iss >> numCities)
        FATAL("unable to parse numCities value out of line '" << line << '\'')
    if (iss.getchar())
        FATAL("unparsabel trailing garbage characters after numCities value on line '" << line << '\'')

    // etc. (you can factor the above kind of logic into a function...)
}
于 2012-07-23T01:36:52.927 に答える
1

まず、を使用cinして入力を読み取り、次にを使用しますgetline。ただし、最後の数字を読むと、'\n'欠落があります。あなたの最初getline(cin, str)は読んでい'\n'ます、これがあなたがセグメンテーション違反を起こす理由です。これを確認するには、コードに次の行を追加します。

// just change these lines: 
getline(cin, str);
cout << str << endl;
while(getline(cin, str))
{
    cout << str << endl;

    // ...

出力は次のようになります。

// output
3 4

7 8 3
7 9 2
8 9 1
0 1 28

すべての数字を次のように取得したいだけですintか?この入力については、次のことをお勧めします。

while (cin >> x >> y >> z) 
{
    cout << x << " " << y << " " << z;
}

getline()解決

引き続き機能をご利用いただけgetlineます。getline次に、最初の2行にも使用するように入力読み取り値を変更することをお勧めします。このようにすることで、に問題が発生することはありません'\n'。しかし、それは複雑になりすぎると思うので、お勧めしません。特にマラソンの問題の場合。

// ...
getline(cin, str);
numCities = atoi( str.c_str() );

getline(cin, str);
numRoads = atoi( str.c_str() );

cout << numCities << " " << numRoads << endl;

while(getline(cin, str))
  {    
    char *cstr;
    cstr = new char[str.size()+1];
    strcpy(cstr, str.c_str());

    x = atoi(strtok(cstr, " "));
    y = atoi(strtok(NULL, " "));
    z = atoi(strtok(NULL, " "));
  }
于 2012-07-23T01:38:31.200 に答える
0

データを文字列に格納してから、文字列を整数に変更できます。

テストコードは次のとおりです。

#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <string>
using namespace std;

int main(int argc, char* argv[])
{
    ifstream in("t1.txt");

    string s1,s2,s3;
    int a1,a2,a3;

    in>>s1>>s2;
    a1 = atoi(s1.c_str());
    a2 = atoi(s2.c_str());
    cout<<a1<<" "<<a2<<endl;

    while((in>>s1>>s2>>s3))
    {
        a1 = atoi(s1.c_str());
        a2 = atoi(s2.c_str());
        a3 = atoi(s3.c_str());
        cout<<a1<<" "<<a2<<" "<<a3<<endl;
    }

}
于 2012-07-23T01:25:04.760 に答える