fread()不能正确写入字符串

时间:2012-12-08 02:27:12

标签: c file fread

我正在尝试使用fread()将文件的内容写入char数组,但它似乎不起作用。这是我实现它的程序的一部分。我已经包含了很多trace语句来检查每个步骤是否给出了正确的输出。所有这些似乎都很完美。 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);
    }
}

3 个答案:

答案 0 :(得分:2)

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

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

1234567890abcde

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

abcde67890

然后缓冲区中不会有空终止符(假设刚刚读取的数据中不包含零)。因此printf可能包含缓冲区末尾的数据。

答案 1 :(得分:0)

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

fread(sendFileBuf, 1, fileSize, newFp);

memset()相同:

memset(sendFileBuf, 0, sizeof(sendFileBuf));

答案 2 :(得分:0)

没有人问过这个,所以我们走了:你说这个函数“出现了像ÿØÿá这样奇怪的字符”。

是什么让你认为这些角色很怪异?你想读什么样的文件?它是文本文件吗?还是MP3?还是图像文件?还是别的什么呢?

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