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

Я использовал 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)?


person Omer Anisfeld    schedule 06.08.2018    source источник
comment
есть ли случайно '\0' байт сразу после /usr/sbin/sshd в файле?   -  person Sander De Dycker    schedule 06.08.2018
comment
также напечатайте возвращаемое значение fread(source, 1, MAXBUFLEN, fp);   -  person Jean-François Fabre    schedule 06.08.2018
comment
fread() не помещает строку в source[]. Использование содержимого source[] в виде строки ошибочно.   -  person AlexP    schedule 06.08.2018
comment
доброе возвращение 167   -  person Omer Anisfeld    schedule 06.08.2018
comment
Пожалуйста, ответьте на вопрос Сандера. При необходимости используйте hex-редактор, чтобы выяснить это. Кроме того, вручную создайте файл, содержащий только печатные буквы, как показано здесь.   -  person Yunnosch    schedule 06.08.2018
comment
Я проверил ваш код, он читает полный образец файла, который вы предоставили. fread возвращает 159.   -  person devd    schedule 06.08.2018
comment
В образце ввода показано 158 видимых символов. Fread counts 167. Разница может быть объяснена тем, что на \0 перед каждым из - в видимом вводе выборки и одним пробелом или 0 в конце. т.е. Пожалуйста, ответьте на вопрос Сандерса.   -  person Yunnosch    schedule 06.08.2018
comment
Не твоя проблема, но: rewind(fp) не нужен.   -  person Steve Summit    schedule 06.08.2018
comment
Похоже, вы отлаживаете созданную вами строку командной строки. Похоже, есть проблема с тем, как вы строите эту строку. Я замечаю такие вещи, как sshd-p там, где я ожидал бы sshd -p, и =30-o там, где я ожидал бы =30 -o». Вполне вероятно, что вы каким-то образом вставляете символы '\0' вместо пробелов при объединении аргументов. Это объяснило бы симптом, который вы видите.   -  person Steve Summit    schedule 06.08.2018
comment
Сандер, между каждым файлом было 0 символов   -  person Omer Anisfeld    schedule 06.08.2018
comment
printf("ret : %d %s",ret,source); возникает проблема, если текстовый файл не содержит ни одного нулевого символа. В этом случае printf() пытается напечатать source как строку, однако неизвестно, что source имеет завершающий нулевой символ.   -  person chux - Reinstate Monica    schedule 06.08.2018
comment
самый простой способ прочитать весь этот файл? --› код сделал это. Тут беда не в чтении, а в печати.   -  person chux - Reinstate Monica    schedule 06.08.2018
comment
Самый простой способ распечатать файл после прочтения: fwrite(source, 1, ret, stdout);   -  person chux - Reinstate Monica    schedule 06.08.2018


Ответы (1)


Ответ: между каждым словом в этом файле стоял 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);
 }
person Omer Anisfeld    schedule 06.08.2018