Читать из файла (C ++) - PullRequest
       20

Читать из файла (C ++)

1 голос
/ 03 мая 2011

Я не могу понять, почему это не будет читать из моего файла ...

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

int main()
{
    int acctNum;
    int checks;
    double interest;
    double acctBal;
    double monthlyFee;
    const int COL_SZ = 3;
    ifstream fileIn;
    fileIn.open("BankAccounts.txt");
    if(fileIn.fail())
    {
        cout << "File couldn't open." << endl;
    }
    else
    {
        cout << left;
        cout << "Bank Account records:" << endl;
        cout << setw(COL_SZ) << "Account#" << setw(COL_SZ) <<
            "Balance" << setw(COL_SZ) << "Interest" << setw(COL_SZ) << "Monthly Fee" << setw(COL_SZ) <<
            "Allowed Checks" << setw(COL_SZ) << endl;
        while(fileIn >> acctNum >> acctBal >> interest >> monthlyFee >> checks)
        {
            cout << setw(COL_SZ) << acctNum << setw(COL_SZ) << acctBal << setw(COL_SZ) << interest << setw(COL_SZ) <<
                monthlyFee << setw(COL_SZ) << checks << endl;
        }
    }
    fileIn.close();
    system("pause");
    return 0;
}

Я вынул ios :: out и вставил ios :: в том жене было никаких данных и то же самое с извлечением ios все вместе. Я сделал файл из предыдущей программы ... я должен был бы поместить чтение кода файла в эту программу?The BankAccount.txt file as a picture.

Ответы [ 2 ]

1 голос
/ 03 мая 2011

У вас есть

fileIn.open("BankAccounts.txt", ios::out);
                                ^^^^^^^^

Вы открываете файл для вывода.Попробуйте ios :: in.

1 голос
/ 03 мая 2011

Редактировать

Глядя на ваш ввод, вы не можете прочитать такой сложный ввод, просто

while(fileIn >> acctNum >> acctBal >> monthlyFee >> checks)

Этот код настроен для чтения данных, отформатированных в следующей форме:

11 12.12 11.11 13.13 14.12
11 12.12 11.11 13.13 14.12
11 12.12 11.11 13.13 14.12

Вместо этого вам придется читать различные строки и тому подобное, прежде чем извлекать нужные данные. Например, чтобы пропустить слово «Аккаунт» ниже, вы можете прочитать его в фиктивную строку

Account Number#1234
 std::string dummy; 
 fileIn >> dummy;   // read up to the whitespace, 
                    // in this case reads in the word "Account"

Тогда Чтобы получить число, вам нужно прочитать следующую строку и извлечь # 1234

 std::string temp; 
 fileIn >> temp;   // read up to the whitespace, 
                    // in this case reads in the word "Number#1234"

Но вы также можете использовать getline для чтения до # 1020 включительно

 std::getline(fileIn, dummy, '#');

Затем прочитайте число после #

 int acctNum = 0;
 fileIn >> acctNum;

Так что, если ваш ввод действительно отформатирован, как вы описываете, вам придется потратить гораздо больше времени на выяснение того, как анализировать ваши данные, чем вы могли ожидать. Я не знаю достаточно о том, как ваш вклад должен дать вам полный ответ, но, надеюсь, приведенное выше должно помочь вам начать.

(При желании вы можете узнать о регулярных выражениях, но на данный момент вы можете просто захотеть изучить основы.)

Оригинал

Я только что опробовал ваш код, и с достаточно хорошо отформатированными значениями на входе он работает в g ​​++. Однако одна вещь, которую я с осторожностью смотрю на ваш код, это строка:

   while(fileIn >> acctNum >> acctBal >> monthlyFee >> checks)

Если что-либо из вышеперечисленного не удается прочитать из-за преждевременного завершения файла, ваш cout не будет выполнен, что не приведет к выводу на экран. Имеет ли ваш вклад все вышеперечисленные значения? Они хорошо отформатированы? Для отладки я мог бы попытаться разбить чтение:

   while (fileIn)
   {
       fileIn >> acctNum;
       std::cout << "Acct num is:" << acctNum << std::endl;
       ...
   }

или просто перейдите к отладчику.

Например, для этого ввода:

11 12.12 11.11 13.13 14.12

ваш код распечатывается

Bank Account records:   
Account#BalanceInterestMonthly FeeAllowed Checks   
11 12.126.93517e-31011.1113 `

Но прикручиваем к вводу и добавляем куда-то случайный нечисловой символ, т.е.

11 * 12.12 11.11 13.13 14.12

заставляет меня получить только

Bank Account records:     
Account#BalanceInterestMonthly FeeAllowed Checks

Так что я бы определенно по кусочкам посмотрел на то, что читается и где сбой чтения из fileIn, это определенно вызовет ваши проблемы.

Вы знаете, конечно, чтобы удалить ios::out, как указано здесь

...