Почему я не могу ввести целые числа из файла? - PullRequest
2 голосов
/ 16 марта 2010

Я пытаюсь получить этот код 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, и если да, то как мне заставить его работать?

Спасибо!

Энтони Глядченко

Ответы [ 5 ]

2 голосов
/ 16 марта 2010

Может быть, открытие файла не удалось?
Вы можете проверить, установлен ли failbit iffer с помощью fail ()

if(iffer.fail())
{
  cout << "Failed to open file." << endl;
}
1 голос
/ 16 марта 2010

Должно работать, но имейте в виду, что «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] = ' '
...
1 голос
/ 16 марта 2010

Пробовал (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;
}

Это сработало, но второй цикл неправильный.

0 голосов
/ 16 марта 2010

Я попробовал ваш код, слегка измененный, на обоих Linux (g ++ 3.4.4) и Mac (g ++ 4.0.1) и он работает просто отлично!

Что касается Чака, если input.txt не существует, iffer.fail () имеет значение true. Поскольку вы говорите, что это не так ...

Другая возможность - это файл , отличный от input.txt , чем вы ожидали. Если бы в нем было слишком мало чисел, вы бы увидели нули (или другие значения мусора). (Вы можете проверить с помощью iffer.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() );
}
0 голосов
/ 16 марта 2010

Это звучит как проблема пути. У вас есть файл "input.txt" где-то , но не в текущем каталоге. Если это в приложении с графическим интерфейсом, имейте в виду, что текущий каталог несколько непредсказуем, и вы должны либо указать абсолютный путь или путь относительно некоторого известного пути (например, путь к текущему CFBundle приложения).

Просто чтобы проверить, я только что создал Unix-программу, включающую ваш точный код, заключенный в следующий код:

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

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

Это сработало, поэтому, если это в программе командной строки, и вы запустили ее из нужного каталога, вы должны изменить текущий каталог где-то в вашем приложении.

...