我正在尝试使用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);
}
}
答案 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?还是图像文件?还是别的什么呢?
您在屏幕上看到的内容可能完全有效,因为许多文件包含的数据不是人类可读的。您正在打印(作为字符串)文件内容,可能根本不是字符串。