2

我试图让这个 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 的问题吗?如果是,我怎样才能让它工作?

谢谢!

安东尼·格利亚琴科

4

5 回答 5

2

也许打开文件失败?
你可以检查 if 的 failbit 是否设置了 fail()

if(iffer.fail())
{
  cout << "Failed to open file." << endl;
}
于 2010-03-16T00:54:38.497 回答
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;
}

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

于 2010-03-16T00:42:52.007 回答
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] = ' '
...
于 2010-03-16T01:33:34.737 回答
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;
}

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

于 2010-03-16T01:47:49.183 回答
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() );
}
于 2010-03-16T02:10:27.690 回答