为什么我不能从文件中输入整数?

时间:2010-03-16 00:30:26

标签: c++ macos input ifstream

我正在尝试使用此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问题,如果是这样,我怎么能让它工作?

谢谢!

Anthony Glyadchenko

5 个答案:

答案 0 :(得分:2)

也许打开文件失败了?
您可以检查商品的failbit是否设置为fail()

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

答案 1 :(得分:1)

尝试(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;
}

这很有效,但第二个循环是错误的。

答案 2 :(得分:1)

它应该有用,但请注意,“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] = ' '
...

答案 3 :(得分:0)

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

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

#include <iostream>
#include <fstream>
using namespace std;

int main() {
    int x = 0;
    // your code
    cout << numbers[5] << endl;
    return 0;
}

它有效,所以如果这是在命令行程序中并且您从正确的目录启动它,则必须在应用程序的某个位置更改当前目录。

答案 4 :(得分:0)

我在 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() );
}