2

我正在尝试使用fread()将文件的内容写入 char 数组,但它似乎不起作用。这是我在其中实现它的程序部分。我包含了很多跟踪语句来检查每个步骤是否给出了正确的输出。他们似乎都很完美。fileSize出来的正确。的大小sendFileBuf也正确显示。当它进入while循环时,printf那里的语句只执行了两次,即使fileSize值在 62000 左右。当我打印时sendFileBuf,它会出现奇怪的字符,比如ÿØÿá. 我已经用几个文件试过了,总是有一些错误。请帮帮我!

void sendFile(fileNode fileToSend, int sockFd)
{
    int fileSize;

    fileSize = atoi(fileToSend.fileSize);
    printf("file size after conversion to int: %d\n", fileSize);

    //Sending file size
    if(send(sockFd, fileToSend.fileSize, sizeof(fileToSend.fileSize), 0) < 0)
    {
        perror("Sending file size");
        close(sockFd);
        exit(1);
    }

    //Send actual file
    FILE *newFp;
    char path[50];
    strcpy(path, "SharedFiles/");
    strcat(path, fileToSend.fileName);

    if((newFp = fopen(path, "r")) == NULL)
    {
        perror("Opening file");
        exit(1);
    }

    //Write file to buffer and send
    char sendFileBuf[fileSize];
    memset(&sendFileBuf, 0, sizeof(sendFileBuf));
    printf("Size of sendfilebuf: %ld", sizeof(sendFileBuf));

    fread(&sendFileBuf, 1, fileSize, newFp);

    printf("sending file buffer %s\n", sendFileBuf);
    if(send(sockFd, sendFileBuf, sizeof(sendFileBuf), 0) < 0)
    {
        perror("Sending file");
        fclose(newFp);
        close(sockFd);
        exit(1);
    }
}
4

3 回答 3

2

包含调用的 while 循环fread可能没有执行您想要的操作。如果在一次调用中未能读取所有内容,则第二次调用会将数据读入缓冲区的开头(并覆盖第一次迭代中写入的内容)。

例如,假设缓冲区是 10 字节,而您正在读取的数据是:

1234567890abcde

第一个循环将读取前 10 个字符 ( 1234567890)。第二次迭代将读abcde入缓冲区的开头。之后,缓冲区将包含:

abcde67890

并且缓冲区中不会有空终止符(假设刚刚读取的数据中不包含零)。所以 printf 可能会包含缓冲区末尾的数据。

于 2012-12-08T02:48:33.673 回答
0

没有其他人问过这个,所以我们开始吧:你说这个函数“出现了奇怪的字符,比如ÿØÿá”。

是什么让你觉得这些角色很奇怪?您要读取什么样的文件?是文本文件吗?还是MP3?还是图片文件?或者完全是别的什么?

您在屏幕上看到的内容可能是完全有效的,因为许多文件包含人类不可读的数据。您正在打印(作为字符串)可能根本不是字符串的文件内容。

于 2012-12-08T05:34:28.047 回答
0

当您sendFileBuf在表达式上使用时,它会衰减为指针,因此您不必取消引用它&。试试这种方式:

fread(sendFileBuf, 1, fileSize, newFp);

同样的事情memset()

memset(sendFileBuf, 0, sizeof(sendFileBuf));
于 2012-12-08T02:29:48.013 回答