从文件中读取(C ++)

时间:2011-05-03 02:08:51

标签: c++ iostream readfile

我无法弄清楚为什么这不会从我的文件中读取...

#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 个答案:

答案 0 :(得分:1)

修改

查看您的输入,您无法仅使用

读取此类复杂输入
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来阅读并包含#

 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的读取失败的情况,这肯定会导致您的问题。

您当然要删除指定here

ios::out

答案 1 :(得分:1)

你有

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

您正在打开输出文件。试试ios :: in。