将文件行的每个元素转换为整数

Posted

技术标签:

【中文标题】将文件行的每个元素转换为整数【英文标题】:Converting Each Element of a Line of a File into an Integer 【发布时间】:2013-12-22 18:48:10 【问题描述】:

我有一个名为 numbers.txt 的文件,其中包含几行数字。我只是想将每个数字转换为整数并打印出来。

if (numbers.is_open()) 
    while (std::getline(numbers, line)) 
        for (int i = 0; i < line.length(); i++) 
            number = atoi((line.at(i)).c_str());
            std::cout << number;
        
    
    numbers.close();

有人可以解释为什么这对我不起作用吗?

【问题讨论】:

我建议使用std::istringstream。在 *** 中搜索“c++ istringstream getline”。 【参考方案1】:

您的初始代码甚至不应该编译,因为std::string::at(size_t pos) 不会返回std::string;它返回一个原始字符类型。角色没有方法——没有char::c_str() 方法!

如果您上面的评论是正确的,并且您想将单个字符视为数字,我建议如下:

if (numbers.is_open())

    while (std::getline(numbers, line))
    
        auto i = line.begin(), e = line.end(); // std::string::const_iterator
        for (; i != e; ++i)
        
            if (std::isdigit(*i))
            
                // Since we know *i, which is of type char, is in the range of
                // characters '0' .. '9', and we know they are contiguous, we
                // can subtract the low character in the range, '0', to get the
                // offset between *i and '0', which is the same as calculating
                // which digit *i represents.
                number = static_cast<int>(*i - '0');
                std::cout << number;
            
            else throw "not a digit";
         // for
     // while
    numbers.close();
 // if

【讨论】:

【参考方案2】:

您的内部for 循环遍历行中的每个字符,这是不必要的,假设您要将整行视为单个数字。 atoi() 函数作用于整个 c 字符串,而不仅仅是单个字符。因此,您可以摆脱for 循环和.at(i),只需执行以下操作:

if (numbers.is_open()) 
    while (std::getline(numbers, line))                                      
        int number = atoi(line.c_str());
        std::cout << number << std::endl;                            
    
    numbers.close();
  

编辑(w.r.t 评论 #0)

要单独解释每个字符,您可以这样做(尽管可能有更简洁的实现):

if (numbers.is_open()) 
    while (std::getline(numbers, line)) 
      for (int i = 0; i < line.length(); i++)                                                      
        int number = atoi(line.substr(i, 1).c_str());
        std::cout << number << endl;
        
    
    numbers.close();
  

如果你能保证文件中只有数字,你也可以像这样进行转换:

int number = line.at(i) - '0';

【讨论】:

我想把每个字符当作一个数字。

以上是关于将文件行的每个元素转换为整数的主要内容,如果未能解决你的问题,请参考以下文章

使用啥 ffmpeg 命令将无符号整数列表转换为音频文件?

将字符串元素转换为整数C++ [重复]

C语言基础:enum 枚举类型(定义遍历枚举元素枚举在 switch 中的使用将整数转换为枚举)

将每行从整数列表转换为整数数组?

厨师属性“没有将字符串隐式转换为整数”

转换 DataRow 项目数组的特定元素?