从一行解析整数

问题描述:

我正在解析一个输入文本文件。如果我使用getline()一次获取输入的一行,是否有一种方法可以搜索字符串以获取整数?我正在考虑类似于Java中的getNextInt()。从一行解析整数

我知道在该输入行中必须有2个数字;然而,这些值将被一个或多个空格字符分隔,所以我不能只是去特定的位置。

如果在那里的唯一事情是空白和整数,只要尝试这样的事:

int i1, i2; 
stringstream ss(lineFromGetLine); 
ss >> i1 >> i2; 

或更容易:

int i1, i2; 
theFileStream >> i1 >> i2; 
+0

如何做它的字符串不char * – Yoda 2012-06-19 12:18:32

+1

@罗伯特:我不知道你的投诉是什么。你可以像`std :: string`一样容易地从char *构造一个stringstream。如果您有不同的问题,请提出一个新问题。但不要随意回答。 – Eclipse 2012-06-19 14:22:15

这不仅仅是一点点C-ISH多,但你可以在C字符串表示中使用sscanf()。或者你可以使用strtol()或亲属 - 也可以用C字符串表示。

更多的C++ - ish方式可能会使用字符串流和提取器。

我想:

while (!inFile.eof()) { 
    getline (inFile,inputLine); 
    stringstream ss(inputLine); 
    ss >> rows >> columns; 
} 

,我得到了以下错误:

“这一术语不计算为服用1个参数的函数” 在行

SS(inputLine);

编辑:所以你必须在你给它参数的时刻声明字符串流。上面编辑的正确代码。

+0

顺便说一句:永远不要在eof()上循环,而是在读 - > while(std :: getline(....)) – 2008-10-19 08:28:53

有几件事要考虑:
让我们假设你在每一行上都有两个数字,然后是你不关心的文本。

while(inFile >> rows >> columns) 
{ 
    // Successfully read rows and columns 

    // Now remove the extra stuff on the line you do not want. 
    inFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
} 

还要注意,如果分离的整数值的唯一的事情是“空白”,那么你甚至不需要使用忽略()行。

上述while()的工作原理是:操作符>>返回一个流对象(引用)。由于流对象正在布尔上下文中使用,编译器会尝试将其转换为布尔值,并且该流对象具有一个转换操作符(通过在流上调用good())进行转换。

重要的是要注意的是使用线

while(inFile.eof()) 

如果你使用这个,那么你落入最后一行的问题陷阱。如果你已经读取了所有的数据,eof()仍然是错误的(因为在你尝试读取过去的EOF之前它是不正确的)。所以文件中没有数据,但你仍然进入循环体。在你的代码中,getline()然后被执行并失败(不再有数据),EOF现在被设置。循环的其余部分将取决于inLine的定义方式和位置。

您可以像上面那样使用此测试。但是,在使用它之后,您还必须愿意测试该流是否正常。

while(inFile.eof()) // Should probably test good() 
{ 
    getLine(inFile,inputline); 
    if(inFile.eof()) // should probably test good() 
    { 
     break; 
    } 
} 

千万不要使用。eof()用于测试您是否可以读取,也可用于测试之前的读取是否失败。因为这两种方法都将在某些情况下会失败:即使有没有留下任何字符,如果没有读取过去的结束已经又试图

  • EOF没有设置(如最后一行的函数getline后,如果有最后一个换行符)
  • 即使在成功读取后,如果读取操作必须在结束后查看下一个字符以确定它应该停止读取(例如,在最后一行的geline后,if最后没有换行字符)

一般而言,您应该只在读取失败后使用.eof()来检查输入结束导致失败。使用while (std::getline(...))来循环线路。