开发者

reading in strings and doubles

I'm having an issue reading in a string from a file and then a double from a file afterwards. My professor advised me to put a special getline after each input line, but it hasn't worked and I've deduced that this is the issue with the program. Is there a simpler way to take in doubles?

example of the input file is:

John Smith
019283729102380
300.00
2000.00
Andrew Lopez
293481012100121
400.00
1500.00

the code reads:

while(! infile.eof())
{
getline(infile,accname[count],'\n');
getline(infile, refuse, '\n');  
getline(infile,accnum[count],'\n');
getline(infile, refuse, '\n');  
infile>>cu开发者_StackOverflow社区rrbal[count];  
getline(infile, refuse, '\n');  
infile>>credlim[count];  
getline(infile, refuse, '\n');  
count++;
}


EDIT: Updated in response to OP's clarification.

Based on the sample you provided, this should work:

while(1) {
    std::string s1;
    if(!std::getline(infile, s1))
        break;
    std::string s2;
    if(!std::getline(infile, s2))
        break;
    double d1, d2;
    if(!(infile >> d1 >> d2))
        break;
    accname[count] = s1;
    accnum[count] = s2;
    currball[count] = d1;
    credlim[count] = d2;
    count++;
}

This code will work for input like:

Adam Sandler
0112233
5 100
Ben Stein
989898
100000000
1

But it won't work for input like:

Adam Sandler

0112233

5 100

Ben Stein

989898

100000000

1


I think Rob Adams's, response has a minor bug when parsing multiple records. After extracting d2 for the first time, the example input stream will contain \nBen Stein\n989898\n100000000\n1, therefore the next call to std::getline() will extract an empty string instead of Ben Stein. So it seems necessary to consume an empty string at the end of each while loop iteration.

I think the following code sample provides a fix:

#include <iostream>
#include <sstream>

int main(int argc, char** argv) {
  using std::stringstream;
  stringstream infile(stringstream::in | stringstream::out);

  infile << "John Smith\n";
  infile << "019283729102380\n";
  infile << "300.00\n";
  infile << "2000\n";
  infile << "Andrew Lopez\n";
  infile << "293481012100121\n";
  infile << "400.00\n";
  infile << "1500.00\n";

  std::string account_name;
  std::string account_number;
  double current_balance;
  double credit_limit;

  int count = 0;

  while (std::getline(infile, account_name) &&
         std::getline(infile, account_number) >> current_balance >>
         credit_limit) {

    std::cout << account_name << std::endl;
    std::cout << account_number << std::endl;
    std::cout << current_balance << std::endl;
    std::cout << credit_limit << std::endl;

    /*
    accname[count] = account_name;
    accnum[count] = account_number;
    currball[count] = current_balance;
    credlim[count] = credit_limit;
    */

    count++;

    // Consume the leading newline character, which seprates the credit limit
    // from the next account name, when infile contains multiple records.
    //
    // For example, after consuming the record for John Smith, the stream will
    // contain: "\nAndrew Lopez\n293481012100121\n400.00\n1500.00\n". If you
    // don't consume the leading newline character, calling std::getline() to
    // parse the next account name will extract an empty string.
    std::string blank;
    std::getline(infile, blank);
  }

  return 0;
}


string str;

while(!infile.eof())
{
    getline(infile, accname[count]);//  you do not need '\n' it will always read to 
                     // end of the line

    getline(infile, accnum[count]);

    getline(infile, str);
    currbal[count] = atof(str.c_str());

    getline(infile, str);
    credlim[count] = atof(str.c_str());

    count++;
}

\* 
for the file 
John Smith
019283729102380
300.00
2000.00
Andrew Lopez
293481012100121
400.00
1500.00
*\
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜