читает, чтобы прочитать определенный размер - PullRequest
0 голосов
/ 29 октября 2011

Я пытаюсь написать программу, которая читает определенное количество символов из имени файла, заданного из командной строки.Вот что у меня есть:

#include <stdio.h>

int main(int argc, char **argv)
{
    int i = 0;
    FILE *f;
    char* fileName = argv[1];
    char buf[40];

    f = fopen(fileName, "r");

    while(!feof(f)){
        fgets(buf, 10, f);
        printf("%s\n", buf);

    }
    fclose(f);

    return 1;
}

Скажем, в данном конкретном случае мне нужно сначала 10 символов, затем следующие 10 символов и т. Д., Пока файл не будет закончен.Однако, когда я запускаю этот код, он на самом деле не дает мне правильного вывода.Я также попробовал 11, так как в документации сказано, что fgets () читает n-1 символов, но это тоже не работает.Некоторые вещи в начале читаются, но потом ничего не получается, и это просто дает мне кучу пробелов.Есть идеи, что не так?

Спасибо

Ответы [ 3 ]

0 голосов
/ 29 октября 2011

fgets предназначен для чтения строки, вплоть до максимальной длины.Если вы хотите читать по 10 символов за раз, независимо от разрывов строк, вы, вероятно, хотите использовать fread вместо:

В любом случае, вы определенно не хотите использовать while (!feof(f)).Вы, вероятно, хотите что-то вроде:

int main(int argc, char **argv) { 
    char buf[40];
    FILE *f;
    if (NULL == (f=fopen(argv[1], "r"))) {
        fprintf(stderr, "Unable to open file\n");
        return EXIT_FAILURE;
    }

    size_t len;
    while (0 < (len=fread(buf, 10, 1, f)))
        printf("%*.*s\n", len, len, buf);
    return 0;
}
0 голосов
/ 29 октября 2011

Это работает почти нормально, если вы удаляете \n из вашей строки формата printf (при условии, что вы хотите в основном отобразить весь файл как есть).

Я также зациклился бы на основе fgets(...) != NULL, поскольку feof() вернет истинное значение после fgets ошибок и попаданий EOF, поэтому ваш последний заполненный буфер будет напечатан дважды. Вы можете внести небольшое изменение в свой код следующим образом:

#include <stdio.h>

int main(int argc, char **argv)
{
    int i = 0;
    FILE *f;
    char* fileName = argv[1];
    char buf[40];

    f = fopen(fileName, "r");

    while(fgets(buf, 10, f))
        printf("%s", buf);

    fclose(f);

    return 0;
}

Кроме того, как уже говорили другие, хотя я слишком долго отвечал, fread может быть лучшей альтернативой, поскольку fgets не обязательно будет читать 10 символов; он останавливается на каждой новой строке, и вам не нужно читать строку за раз.

0 голосов
/ 29 октября 2011

Функция, которую вы ищете: fread, например:

fread(buf, 10, 1, f);
...