【问题标题】:Character by Character Input from a file, in C++在 C++ 中从文件中逐个字符输入
【发布时间】:2011-04-22 03:22:24
【问题描述】:

有没有办法一次从一个文件中获取一个数字的输入? 例如,我想将以下整数存储在整数向量中,因为它很长,甚至不能被 long long int 保存。

12345678901234567900

那么我怎样才能从文件中读取这个数字以便我可以:

vector<int> numbers;
number.push_back(/*>>number goes here<<*/)

我知道上面的代码并不完整,但我希望它能解释我想要做什么。 我也尝试过 google,但到目前为止它已被证明是无效的,因为只有 C 的教程即将出现,这对我并没有太大的帮助。

谢谢提前, 丹·谢瓦利埃

【问题讨论】:

  • 你打算用这么大的数字做什么?您是要简单地显示它,还是要对其执行某种算术运算?
  • 我正在为 2 月即将到来的 CCC 比赛而学习,所以我正在处理前几年的所有问题。我在 1995 年,问题 B。在这个程序中,我们取一个很大的数字,并通过截断最后一个数字并从剩余数字中减去该数字来确定它是否可以被 11 整除。然后重复此操作,直到剩下 2 个数字。这在理论上很简单,除了存储这些大量整数:S

标签: c++ input integer


【解决方案1】:

您可以使用char c; cin.get(c); 一次读取一个字符,然后使用c -= '0' 将其转换为数字。但也许您可以将其读取为字符串或使用BigNum 之类的内容。

【讨论】:

  • 我只是假设,但 c-= '0' 是指 c 的值减去 ascii 值 0 吗?
  • 另外我想我会尝试输入一个字符串,然后单独转换为整数,谢谢你的提示:)
  • 是的,我对 cin 的事情也有同样的想法:P
  • 我将整行读取为字符串,现在我尝试使用 atoi() 将每个单独的 char 更改为 int。它一直给我这个错误“从'char'到'const char *'的无效转换”你知道为什么会这样以及我该如何解决它吗?
【解决方案2】:

在我的脑海中,这应该填充一个字符数组,然后您可以对其进行迭代。我意识到这不是您所追求的,但这是我的首选方法。

void readfile(char *string)
{
    ifstream NumberFile; 
    NumberFile.open("./Number"); //For a unix file-system
    NumberFile >> string;
    NumberFile.close();
}

此外,要对您可以使用的实际数字执行操作:

CharacterArray[ElementNumber] - '0'

要获得足够小以适合数据类型的数字,您可以将数组的每个元素乘以 10 乘以它的索引的幂。

【讨论】:

    【解决方案3】:

    这可以通过多种方式完成,所有这些都归结为将每个字符 '0'..'9' 转换为相应的整数 0..9。以下是使用单个函数调用完成的方法:

    #include <string>
    #include <iostream>
    #include <vector>
    #include <iterator>
    #include <functional>
    #include <algorithm>
    int main()
    {
            std::string s = "12345678901234567900"; 
            std::vector<int> numbers;
            transform(s.begin(), s.end(), back_inserter(numbers),
                      std::bind2nd(std::minus<char>(), '0'));
            // output
            copy(numbers.begin(), numbers.end(),
                 std::ostream_iterator<int>(std::cout, " "));
            std::cout << '\n';
    }
    

    从文件中读取时,您可以直接从 istream 迭代器中读取字符串和 transform(),甚至是 transform(),如果该文件中除了您的号码之外没有其他内容:

        std::ifstream f("test.txt");
        std::vector<int> numbers;
        transform(std::istream_iterator<char>(f),
                  std::istream_iterator<char>(),
                  back_inserter(numbers),
                  std::bind2nd(std::minus<char>(), '0'));
    

    【讨论】:

    • 哇,这看起来非常复杂,但同时又合乎逻辑。为什么减去“0”使其成为可操作的数字? “0”有什么特别之处吗?
    • @TopGunCpp: '0' - '0' 是整数 0 因为它们是相同的。 '1' - '0' 是整数 1,因为在 ASCII、EBCDIC 以及其他字符集(如果存在)中,“1”正好是“0”之后的 1 个位置。等等如果你不想依赖这个算法,你总是可以transform(s.begin(), s.end(), back_inserter(numbers), boost::lexical_cast&lt;int, char&gt;);
    • @TopGunCpp:这是一个简单的整数减法。 '0' 相当于 48 (ASCII)。由于您正在阅读字符(文本),并且需要数字,因此最快的转换是'1'-'0' -&gt; 49-48=1'9'-'0' -&gt; 57-48=9
    • 哇,我从来没有意识到 '' 可能是使用字符的 ASCII 值的语法,但这很有意义。为了尽可能多地学习,我会尝试你的变换方法,并在不同的情况下尝试它。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2012-07-22
    • 2018-04-28
    • 2018-09-28
    相关资源
    最近更新 更多