PAGE2GO2 HOME | INTERNET NEWS

LeighExchange - Free Advertising Network Stock Research at Internet Speed Need Money Easy and Quick?

Re: Read file problem

 List
Subject: Re: Read file problem
Poster: Mike Wahler
Date: Fri, 23 Mar 2007 21:01:00 GMT
Related Postings: 1 2
wrote in message news:1174681412.258828.174170@e1g2000hsg.googlegroups.com...
>I would like to write a program to read a text file (data.txt) on
> Windows and Linux machines.
>
> data.txt is formated as follows:
>
> 1 10 100 1000
> 2 20
> (a new but empty line)
>
>
> My C++ program is:
>
> ***************************************
> ifstream fp_input("data.txt");
> int a,b;
>
> while(!fp_input.eof())
> {
> fp_input>>a;
>
> cout<<"a="<
>
> while(fp_input.peek()!='\n' && fp_input.peek()!='\r' && !
> fp_input.eof())
> {
> fp_input>>b;
> cout<
> }
>
> cout<
> }
> ***************************************
>
> However, the output of my program is:
>
> 1: 10 100 1000
> 2: 20
> 2:
>
> I don't know why there is an extra "2" in the end of the output.

Because your 'while' loop is incorrect. 'eof()' does not report true until *after* an attempt to read past end of file. It does not 'predict' the next read will fail.


>
> Could someone give me a clue to modify my program such that it can
> display "data.txt" properly under Windows and Linux?

#include #include #include #include #include

int main() { int ret(EXIT_SUCCESS); std::ifstream fp_input("data.txt");

if(fp_input) { std::string line;

while(std::getline(fp_input, line)) { std::istringstream iss(line); int a(0);

if(iss >> a) { std::cout << a << ": "; int b(0);

while(iss >> b) std::cout << b << ", ";

if(!iss.eof()) { std::cerr << "Error reading input\n"; ret = EXIT_FAILURE; break; }

std::cout << '\n'; } else { std::cerr << "Error reading input\n"; ret = EXIT_FAILURE; break; }

} } else { std::cerr << "Cannot open input\n"; ret = EXIT_FAILURE; }

return ret; }

Note that if the last line of the input file is empty (contains only a newline character), parsing it will cause an error to be reported, since your algorithm unconditionally expects an integer as the first part of a line (the item you read into object 'a'). You'll either need to eliminate this 'requirement', or remove the blank line.

-Mike

 

Page2Go2.com is not responsible for content of this message.