jet
jet

Reputation: 183

Outputting from file one line at a time

I'm trying to output text from a file one line at a time. I'm currently hardcoding it and I have this so far:

int main(int argc, char *argv[])
{
    int x;
    int k;
    int limit = 5;
    FILE *file;

    file = fopen("C:\\Documents and Settings\\jon\\My Documents\\Visual Studio 2008\\Projects\\Project1\\Assignment8_2\\Debug\\TestFile1.txt", "r");
    if (file == NULL) {
        perror("Error");
    }

    for (k = 1; k <= limit; k++) {
        while ((x = fgetc(file)) != '\n') {
            printf("%c", x);
        }
    }
    fclose(file);
}

I was wondering where in the code above, if at all, I can check for EOF. I assume I need to do that, but not sure why. Still learning.... Thanks!

Upvotes: 1

Views: 441

Answers (5)

Nicholaz
Nicholaz

Reputation: 1429

you can call feof() to check for EOF or check if the return code for fgetc() matches EOF.

I'm adding both versions to your code although I'm not sure what the loops (especially the outer one) are supposed to do, but within the context of your sample, EOF checking would look like this..

/* EOF would now terminate both loops, using feof() and fgetc() return to check EOF */ 
for (k = 1; k <= limit && !feof(file); k++) {
    while ((x = fgetc(file))!='\n' && x!=EOF) {
            printf("%c", x);
    }
}

Upvotes: 0

DevSolar
DevSolar

Reputation: 70243

fgets() for C, getline() for C++.

C:

#include <stdio.h>
#include <stdlib.h>

// adjust as appropriate
size_t const MAX_LINE_LENGTH = 1024;

int main()
{
    FILE * in;
    char line[ MAX_LINE_LENGTH ];
    if ( ( in = fopen( "test.txt", "r" ) ) == NULL )
    {
        puts( "Failed to open test.txt." );
        return EXIT_FAILURE;
    }
    while ( fgets( line, MAX_LINE_LENGTH, in ) != NULL )
    {
        printf( "%s", line );
    }
    fclose( in );
    return EXIT_SUCCESS;
}

C++:

#include <iostream>
#include <fstream>
#include <string>

int main()
{
    std::ifstream in( "test.txt" );
    std::string line;
    while ( getline( in, line ) )
    {
        std::cout << line << std::endl;
    }
    in.close();
    return 0;
}

Upvotes: 2

Alex Martelli
Alex Martelli

Reputation: 881555

If you can bound the maximum length of a line, fgets may be a better way to read each line; but since you mention C++, you might consider using, instead, getline (caveat: fgets also put the \n in the buffer it fills, getline doesn't). Both make easy to check for end of file (fgets returns NULL on eof, getline sets the eofbit on its istream argument, which it also returns).

Upvotes: 5

RageZ
RageZ

Reputation: 27313

you should check the eof from the output of fgetc:

...
x = fgetc(file);
while (x != '\n' && x != EOF) {
...

fgetc manual there

Upvotes: -1

Graviton
Graviton

Reputation: 83254

Maybe you can try this:

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

int main() {
    int sum = 0;
    int x;
    ifstream inFile;

    inFile.open("test.txt");
    if (!inFile) {
        cout << "Unable to open file";
        exit(1); // terminate with error
    }

    while (inFile >> x) {
        sum = sum + x;
    }

    inFile.close();
    cout << "Sum = " << sum << endl; 
    return 0;
}

Upvotes: 2

Related Questions