【问题标题】:Why can't I input the integers from a file?为什么我不能从文件中输入整数?
【发布时间】:2010-03-16 00:30:25
【问题描述】:

我正在尝试让这个 C++ 代码从文本文件中输入一系列数字:

    int x = 0;
    cin >> x;

    ifstream iffer;
    int numbers[12];
    iffer.open("input.txt");
    for (int i = 0; i < 12; i++){
        iffer >> numbers[i];
    }

这似乎不适用于 Mac。 无论文本文件中的值如何,每个单元格都将等于 0。换句话说,ifstream 没有分配数字。

我怎样才能做到这一点?是 Mac 的问题吗?如果是,我怎样才能让它工作?

谢谢!

安东尼·格利亚琴科

【问题讨论】:

  • 文本文件是什么样的?
  • 你应该把它添加到问题中;)
  • 是不是和文本文件编码有关?或者 Mac 路径的工作方式?请帮帮我!!!!!!

标签: c++ macos input ifstream


【解决方案1】:

可能打开文件失败?
可以用fail()检查ifer的failbit是否设置了

if(iffer.fail())
{
  cout << "Failed to open file." << endl;
}

【讨论】:

  • 好吧,代码在 Linux 上运行也刚刚测试过。您如何检查字段的值?如果您不使用调试器,您可以发布完整的代码吗?
  • 太奇怪了,我测试以确保我的语言没有混淆,看起来我是对的,但现在我再次测试,我错了。对困惑感到抱歉。不知道我做了什么样的白痴让它看起来像开放并没有失败。
【解决方案2】:

尝试过(VC9.0):

#include <iostream>
#include <fstream>

int main()
{
    using namespace std;

    int x = 0;
    cin >> x;

    ifstream iffer;
    int numbers[12];
    iffer.open("input.txt");
    for (int i = 0; i < 12; i++){
        iffer >> numbers[i];
    }
    for (int i = 1; i < 12; i++){
        numbers[i] = i;
    }

    return 0;
}

这行得通,但第二个循环是错误的。

【讨论】:

    【解决方案3】:

    它应该可以工作,但请注意,“get”总是只会读取一个字符。这是我在 Mac OSX 上测试过的,但这与你的操作系统无关,因为它是标准 C++:

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main(){
        ifstream iffer;
        iffer.open("input.txt");
        char numbers[12];
        int i = 0;
        while (iffer.good()){
            numbers[i] =  iffer.get();
            i++;
        }
        for (int n = 0; n < 8; n++){
            cout << numbers[n];
        }        
        cout << endl;
        iffer.close();
    }
    

    我正在读取的文件“input.txt”。确保此文件在您的工作目录中!

    12345678
    

    读取文件时,每个字符都将存储在您的数组中。所以当你有一个像

    这样的文件时
    1 2 3 4 5 6 
    

    您的数组将包含

    numbers[0] = '1'
    numbers[1] = ' ' 
    numbers[2] = '2'
    numbers[3] = ' '
    ...
    

    【讨论】:

    • 我认为阅读单个字符并不能真正解决 OP 的问题...
    • 但是如果文件看起来像他描述的那样,这也将成为一个问题。例如,“12”将存储在两个单独的索引下,对应的 ascii 值为 49 和 50。
    【解决方案4】:

    我在 Linux (g++ 3.4.4)Mac (g++ 4.0.1) 上都尝试了您的代码,稍作修改!

    对于 Chuck,如果 input.txt 不存在,则 iffer.fail() 是真的。既然你说不是这样……

    另一种可能性是 与您预期的不同 input.txt 文件。如果它的数字太少,您会看到零(或其他垃圾值)。 (您可以使用 iffer.eof() 进行测试,但如果没有尾随空格(如换行符),则可以在读取最后一个数字后(适当地)设置。所以测试 eof() 阅读之前!)

    或者,您可以在代码的其他地方放置一个悬空指针,不恰当地丢弃某些内容。有时添加和删除大块代码将允许您手动“二分查找”这些问题的实际位置。

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    #define SHOW(X) cout << # X " = \"" << (X) << "\"" << endl
    
    int main()
    {
      int x = 0;
      cin >> x;
    
      ifstream iffer;
      int numbers[12];
      iffer.open("input.txt");
      SHOW( iffer.fail() );
      SHOW( iffer.eof() );
      for (int i = 0; i < 12; ++i)
      {
        SHOW(i);
        SHOW(numbers[i]);
        iffer >> numbers[i];
        SHOW(numbers[i]) << endl;
      }
      for (int i = 0; i < 12; ++i)
        SHOW(numbers[i]);
      SHOW( iffer.fail() );
      SHOW( iffer.eof() );
    }
    

    【讨论】:

      【解决方案5】:

      这听起来像是路径问题。您有一个“input.txt”文件somewhere,但不在当前目录中。如果这是在 GUI 应用程序中,请记住当前目录有些不可预测,您应该提供绝对路径或相对于某个已知路径的路径(例如,当前应用程序 CFBundle 的路径)。

      只是为了测试,我刚刚创建了一个 Unix 程序,其中包含您在以下代码中的精确代码:

      #include <iostream>
      #include <fstream>
      using namespace std;
      
      int main() {
          int x = 0;
          // your code
          cout << numbers[5] << endl;
          return 0;
      }
      

      它起作用了,所以如果这是在命令行程序中并且你从正确的目录启动它,你必须在你的应用程序的某个地方更改当前目录。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-23
        • 2019-08-01
        • 2011-02-07
        • 1970-01-01
        • 2012-10-03
        • 1970-01-01
        相关资源
        最近更新 更多