区分文件中的整数和双精度

时间:2015-11-21 22:52:00

标签: c++ vector

我对阅读和写入文件非常陌生。但基本上,我有一个任务,其中一部分要求我确定文件中的一行是整数还是双。

这是我需要帮助的作业的一部分:

  

打开文本文件,一次读取一行内容。确定从文件读取的行是双精度还是整数。您要将整数放在名为iNumbers的向量中,将双精度放在名为dNumbers的向量中。向量iNumbers应该保存指向Integer类的指针,dNumbers应该保存指向Double类的指针。当您向其中一个向量添加值时,您应该使用new并调用带有字符串的构造函数。例如:

iNumbers.push_back(new Integer("12.23"));
     

文件样本:

     
12
20
80.5
99.345
70

根据我的理解,我认为我编写的代码会读取文件中的行,如果它们有"."那么这些将是双倍的,但我不确定如何开始。 关于我应该如何开始的任何帮助将非常感谢并提前感谢。

4 个答案:

答案 0 :(得分:0)

请注意,在C ++(而不仅仅是C ++)中,1e4也是双倍的(值10000)。

如果任务中不允许这样做(并且在数字中找到.就足够了),那么我会为文件创建std::ifstream,使用std::getline从中读取std::string s,然后在字符串中s.find('.'),如果要找到find != s.npos的结果,请将其作为dNumbers传递给new Double(s),如果这样的构造函数适用于您的类。

答案 1 :(得分:0)

以下是您可以直接完成此任务的方法:

  • 使用std::getlinestd::string
  • 读取
  • 使用std::stofstd::stoi将此字符串作为参数来确定类型 - 如果他们抛出std::invalid_argumentstd::out_of_range,则转换无法完成
  • push_back到其中一个数组,具体取决于
  • 的类型

答案 2 :(得分:0)

要迂腐,在一般情况下,判断字符串是否为整数的最佳方法是尝试将其转换为整数而不会出现任何错误或剩余字符。

这是一个非常简单的方法(对于任何类型):

template <typename T>
T string_to( const std::string& s )
{
  T value;
  std::istringstream ss( s );
  ss >> value >> std::ws;
  if (!ss.eof()) throw std::invalid_argument("T string_to()");
  return value;
}

您现在可以测试任何标准整数vs double:

int n;
double d;
try { 
  n = string_to <int> ("12.3"); 
  // it's an int
}
catch (...) {
  try {
    n = string_to <double> ("12.3");
    // it's a double
  }
  catch (...) {
    // it is neither integer nor double
  }
}

如果需要,您可以通过取消设置基本字段"0xF3"来专门化int类型以处理ss.unsetf(std::ios::basefield);之类的内容。

希望这有帮助。

答案 3 :(得分:0)

很高兴看到我们在同一个班级......

您遗漏的任务还有很多。我们有double.cpp和我们的integer.cpp文件,包括构造函数,如果你正确地执行了程序,它会将字符串作为参数,也就是说。所以iNumbers.push_back(new Integer(“12.23”));基本上是说“iNumbers” - 向量的名称,“。push_back” - 将字符串值放入堆栈的函数,“new Integer” - 为Integer类型分配内存,“12.23” - 实际为double值以.txt文件中的字符串形式用作示例。

您需要做的是查看他的演讲幻灯片,其中包含有关I / O文件的内容,您应该没问题。我们甚至在课堂上做了一个例子。

至于关于整数和双重类型的基本问题,它非常简单,我不知道你是如何在不知道差异的情况下完成过去的赋值的,一个整数没有小数点而双重则没有。现在可能有一个更复杂的整数和双重类型的定义,但对于史蒂文森的类,这是你唯一应该考虑的事情。忘记你在数学课上学到的关于整数的知识。这个类的定义不一样。

祝你好运...... 课堂上见 -C