3

正如标题所说,我正在从标准输入读取一串整数。我试图读取的数据以以下形式出现在文本文件中:

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

前两行总是只有一个数字(没有问题!),接下来的每一行都有 3 个数字。该文件作为标准输入重定向到我的程序(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时出现段错误...

提前致谢!

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用于前两行。通过这样做,您将不会遇到问题'\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 回答