Fprintf в C используется, но когда я проверяю, файл пуст - PullRequest
0 голосов
/ 29 марта 2020

Попытка просто записать в .txt файл в c для моего класса сетевого программирования, но мой файл всегда заканчивается пустым в конце использования этого кода. Я ссылался на множество источников и не могу найти ошибки в этом коде. Может быть, больше наборов глаз может помочь. fprintf находится в операторе else в самом верху.

// read the message from client and copy it in buffer
read(sockfd, buff, sizeof(buff));
// print buffer which contains the client contents
printf("From client: %s\t", buff);
if (loopcntr == 0)
{
    // filename = buff
    strcpy(filename, buff);
    // get time and add to filename
    time_t rawtime;
    struct tm * timeinfo;
    time ( &rawtime );
    timeinfo = localtime ( &rawtime );
    strcat(filename, asctime (timeinfo));
    printf("Filename: %s\n", filename);
    // remove \n
    for (int i = 0; filename[i] != '\0'; i++)
    {
        if (filename[i] == '\n')
            filename[i] = ' ';
    }

    strcat(filename, ".txt");
    // create file with new filename
    fp = fopen(filename, "w+");
    if (fp == NULL)
    {
        printf("Error opening file...\n");
        exit(0);
    }

    fseek (fp, 0, SEEK_CUR);
    // send filename back to client
    write(sockfd, filename, sizeof(filename));
    bzero(buff, MAX);
    n = 0;
}
else
{
    fprintf(fp, "%s\n", buff);
    strcpy(buff, "Message recieved...\n");
    write(sockfd, buff, sizeof(buff));
    bzero(buff, MAX);
    n = 0;
}

1 Ответ

0 голосов
/ 29 марта 2020

То, что возвращает read(2), не \0 завершено, поэтому вы не можете использовать его как строку для дескриптора формата %s напрямую.

Если вы резервируете место в буфере для нулевого терминатора, вы может прочитать данные (вы можете передать write(2) a один вычтенный размер буфера, а затем взять число байтов, возвращаемых read(), и поместить в это смещение \0 char.

int n = read(socket, buffer, sizeof buffer - 1);

/* check n < 0 for errors */
if (n < 0) {
   ERROR("read: errno = %d\n", errno);
   /* ... whatever more */
}

buffer[n] = '\0';  /* add a \0 at end of filled data */

printf("Buffer read: %s\n", buffer); /* now it is ok. */

или, если вы не хотите иметь место, чтобы добавить свой собственный \0,

printf("Buffer read: %.*s\n", n, buffer);

, который позволяет вам передавать количество символов в вашем буфере. printf не будет go продолжать поиск символов, поэтому нет необходимости, чтобы буфер был \0 закончен.

note

Все это предполагает, что вы читаете текстовые данные, а не двоичный файл. Если это так, то наиболее вероятным является то, что вы вообще не можете printf(3) это сделать, так как 0x00 байт прервет печать, а управляющие символы будут sh полностью перемещать ваш экран.

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