Лучше использовать getline или cin для заполнения массива из входного файла?

Моя проблема могла быть в указателе или моем синтаксисе здесь. Я пытаюсь заполнить два массива names[] и shares[] из входного файла.

Половина программы, ручной ввод, работает нормально. Каждая попытка fstream half
печатала пустую таблицу вывода с -1.#IND для процента каждого акционера
.

Я пробовал cin >> name >> share, getline(shareFile, name), while(shareFile >> name >> share){ ... names[i] = name; shares[i] = share;, но я не знаю, как правильно использовать getline. Думаю, я работаю с первым. Как я уже сказал, я не знаю, проблема в моем индексе или в коде здесь.

Это функция, которая (я считаю) является проблемой, но, возможно, она просто неправильно передает вещи.

void getFileInputs(string names[], int shares[], int size)
{
    string file;
    string name;
    int share = 0;
    bool isOpen = true;
    ifstream shareFile("inputfile.txt");

    cout << "*----------------------------------*\n"
        << "*     Input From File:             *\n"
        << "*----------------------------------*\n";
    cout << "Please enter the name of the file (.txt): ";
    cin >> file;
    cout << "\n";

    shareFile.open("inputfile.txt");

    if(file == "inputfile.txt" || file == "inputfile")
    {
        int i = 0;
        do{

        for(i = 0; i < size; i++)
            {
                shareFile >> names[i] >> shares[i];
            }

        if(shareFile.eof())
        {
            isOpen = false;
        }
    }while(isOpen == true && shareFile >> name >> share);
    }
    else
    {
        cout << "Unrecognized file name. \n" << endl;
        isOpen = false;
    }
}

person user65384    schedule 24.03.2014    source источник
comment
Вы можете показать, как выглядит входной файл?   -  person R Sahu    schedule 24.03.2014
comment
@R Sahu: Мой пример ввода выглядит как name1 share1 (разрыв строки) name2 share2 (разрыв строки) ... и т. Д. Я не знаю, как форматировать комментарии, но (разрыв строки) нет в фактическом файле. Назначение просто говорит, что программа должна принимать ввод от пользователя или входного файла. Поскольку примеров входного файла нет, я предполагаю, что он будет иметь только имена и общие ресурсы, поскольку в нем должна быть функция, принимающая только имена [arrSize] и разделяющая [arrSize] в качестве параметров.   -  person user65384    schedule 24.03.2014
comment
Пожалуйста, добавьте образец входного файла как часть вашего сообщения.   -  person R Sahu    schedule 24.03.2014


Ответы (1)


Непосредственной проблемой является следующая строка кода:

shareFile.open("inputfile.txt");

Несколькими строками выше, когда вы создали объект shareFile, вы открыли его с именем файла, но не закрыли. Вызов open() в уже открытом файловом потоке устанавливает ошибку в маске ошибок файлового потока. Таким образом, любая попытка выполнения ввода не удастся, пока ошибка не будет удалена из потока.

Более того, поскольку file - это имя файла, я предполагаю, что вы хотели открыть его с этим. Если да, то приведенное выше следует изменить на:

std::ifstream shareFile; // default-construct; no file is opened yet
// ...
shareFile.open(file.c_str()); // open it with the value of user-input

Другая проблема связана с циклом и тем, как вы присваиваете значения из файла массиву. Во-первых, вам следует использовать не do {} while(), а скорее for() цикл. Кроме того, если shareFile достигает конца потока, цикл завершается; таким образом, нет причин использовать логическую переменную isOpen:

for (int i = 0; shareFile >> name >> share; ++i)
{
    // ...
}

Теперь, когда значения успешно помещены как в name, так и в share, вы можете назначить их значениям в массиве:

for (int i = 0; shareFile >> name >> share; ++i)
{
    names[i] = name; shares[i] = share;
}
person 0x499602D2    schedule 24.03.2014