Вывод из файла по одной строке за раз - PullRequest
1 голос
/ 17 ноября 2009

Я пытаюсь вывести текст из файла по одной строке за раз. Я в настоящее время жестко кодирую это, и у меня есть это до сих пор:

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);
}

Мне было интересно, где в приведенном выше коде, если вообще, я могу проверить на EOF. Я предполагаю, что мне нужно это сделать, но не уверен, почему. Все еще учусь .... Спасибо!

Ответы [ 5 ]

5 голосов
/ 17 ноября 2009

Если вы можете ограничить максимальную длину строки, fgets может быть лучшим способом прочитать каждую строку; но поскольку вы упоминаете C ++, вы можете вместо этого использовать getline (caveat: fgets также помещает \n в буфер, который он заполняет, getline - нет). И то, и другое упрощает проверку конца файла (fgets возвращает NULL для eof, getline устанавливает eofbit для своего аргумента istream, который он также возвращает).

2 голосов
/ 17 ноября 2009

fgets() для C, getline() для 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;
}
2 голосов
/ 17 ноября 2009

Может быть, вы можете попробовать это:

#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;
}
0 голосов
/ 17 ноября 2009

Вы можете вызвать feof (), чтобы проверить EOF или проверить, соответствует ли код возврата функции fgetc () EOF.

Я добавляю обе версии в ваш код, хотя я не уверен, что должны делать циклы (особенно внешние), но в контексте вашего примера проверка EOF будет выглядеть следующим образом ...

/* 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);
    }
}
0 голосов
/ 17 ноября 2009

вы должны проверить eof с вывода fgetc:

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

fgetc инструкция там

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...