Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Fread не читает весь файл

Автор вопроса: Omer AnisfeldОтветов: 1

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

Мой код:

#define MAXBUFLEN 4096

int main(){
int ret =0;
    char source[MAXBUFLEN + 1];
    FILE *fp = fopen("test", "r");

    if (fp != NULL)
    {
        rewind(fp);
        ret = fread(source, 1, MAXBUFLEN, fp);
        printf("ret : %d %s",ret,source);
        fclose(fp);
    }
    return 0;

}

Текст файла:

/# cat test
/usr/sbin/sshd-p 1234-o LoginGraceTime=30-o ClientAliveInterval=600-o ClientAliveCountMax=0-o TCPKeepAlive=no-o MaxSessions=1-o MaxStartups=1-o MaxAuthTries=3

Вывод моей программы:

ret : 167  /usr/sbin/sshd

Как проще всего прочитать весь этот файл? (что не является стандартным и не заканчивается на \n)?

  • есть ли случайно '\0' байт сразу после /usr/sbin/sshd в файле? Sander De Dycker 06.08.2018
  • также напечатайте возвращаемое значение fread(source, 1, MAXBUFLEN, fp); Jean-François Fabre 06.08.2018
  • fread() не помещает строку в source[]. Использование содержимого source[] в виде строки ошибочно. AlexP 06.08.2018
  • доброе возвращение 167 Omer Anisfeld 06.08.2018
  • Пожалуйста, ответьте на вопрос Сандера. При необходимости используйте hex-редактор, чтобы выяснить это. Кроме того, вручную создайте файл, содержащий только печатные буквы, как показано здесь. Yunnosch 06.08.2018
  • Я проверил ваш код, он читает полный образец файла, который вы предоставили. fread возвращает 159. devd 06.08.2018

cubuntufread

Ответы

Ответ 1 · Omer Anisfeld

Ответ: между каждым словом в этом файле стоял 0, это было не стандартное слово, а ^@, который записывается отдельно в Linux. Код был исправлен следующим образом:

#include <stdio.h>

void removeNewLine(char * str,int len);

#define MAXBUFLEN 4096

int main(){
    char source[MAXBUFLEN + 1];
    FILE *fp = fopen("test", "r");
    int ret =0;
    if (fp != NULL)
    {
        rewind(fp);
        ret = fread(source, 1,MAXBUFLEN, fp);
        removeNewLine(source,ret);
        fclose(fp);
    }
    return 0;
}

void removeNewLine(char * str,int len){
    int i=0;
    for(i=0; i<len;i++) {
        if((int)str[i]==0 )
        {
            str[i]=' ';
        }
    }
    str[len] = 0;
    printf("%s",str);
 }

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы