feof становится правдой преждевременно - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь отправить файл через сокет, читая по одному символу за раз, пока буфер (массив символов) не заполнится, отправляя его, а затем повторяя до конца файла. Но по какой-то причине feof становится истинным до того, как файл заканчивается (я полагаю, что это может быть, когда буферный массив заполнен).

int c;
int end_loop = 1;
char to_send[BUFFER_LENGTH];
while (end_loop == 1) { //For the entire file
    printf("creating next data\n");
    bzero(to_send, BUFFER_LENGTH);
    for (int i = 0; i < BUFFER_LENGTH - 1; i++) { // read data from file until buffer full or EOF
        c = fgetc(f);
        if (c == EOF) { // If end of file break loop
            printf("EOF\n");
            end_loop = 0;
            break;
        }
        to_send[i] = c;
    }
    for (int i = 0; i < strlen(to_send); i++) {
        printf("%c", to_send[i]);
    }
    n = write(sockfd, to_send, strlen(to_send));
    if (n < 0) {
        perror("ERROR writing to socket");
        exit(1);
    }
}
n = write(sockfd, "EOF", 3);
if (n < 0) {
    perror("ERROR writing to socket\n");
    exit(1);
}

Это вывод из простого файла client output

Возможно, что проблема не в этом, потому что код, кажется, продолжает работать, несмотря на то, что "EOF" встречается.

РЕДАКТИРОВАТЬ: Добавлены предложения из комментариев. Ошибка по-прежнему возникает.

1 Ответ

0 голосов
/ 28 августа 2018

Код должен отслеживать, сколько символов прочитано, а затем printf(), write() столько символов.

while (end_loop == 1) {
    ...
    // for (int i = 0; i < BUFFER_LENGTH - 1; i++) {
    int i;
    for (i = 0; i < BUFFER_LENGTH - 1; i++) { 
      ...
    }
    // for (int i = 0; i < BUFFER_LENGTH - 1; i++) {
    //    printf("%c", to_send[j]);
    for (int j = 0; j < i; j++) {
      ...
    // n = write(sockfd, to_send, BUFFER_LENGTH);
    n = write(sockfd, to_send, i);
    ...
}

Другие проблемы включают

Тест на EOF, не только feof(f)

    c = fgetc(f);
    // if (feof(f)) { // If end of file break loop 
    if (c == EOF) { // If end of file break loop **or input error**

Нет необходимости в -1 при заполнении массива char. -1 может быть полезен со строками, но использование здесь не самая лучшая идея, так как fgetc() может возвращать нулевой символ .

//                                   vvv 
// for (int i = 0; i < BUFFER_LENGTH - 1; i++)
for (int i = 0; i < BUFFER_LENGTH; i++)
// or better 
size_t i; 
for (i = 0; i < sizeof to_send; i++)

ОП исправленный код среднего ответа Хмммммммм.

Не использовать for (int i = 0; i < strlen(to_send); i++) {. Считываемые данные могут содержать нулевые символы , что отрицает правильное использование строк здесь.


Если OP не хочет видеть "EOF\n" перед последней строкой, выведите "EOF\n" после цикла while.

...