我正在将文件从linux复制到我们的文件系统,我们已经成功完成了该操作,但是当文件打印出来时,文件末尾会有多余的字符。我们认为这与内存分配有关,但是我们看不到如何解决它。感谢您的帮助!
实际EOF:∴但是TM不可能决定H,所以M_o不可能存在。} 0E。
[正确的EOF:∴但是TM不可能决定H,所以M_o不可能存在。
void copyToFS(char *filePath, int currentDirectoryID)
{
printf("Enter file path: ");
scanf("%s",filePath);
int node = assignNode(filePath, 0, currentDirectoryID);
long int fileSize = getFileSize(filePath);
FILE *file = fopen(filePath, "r");
printf("\nSize of : %ld", fileSize);
char fileBuffer[fileSize];
if (file != NULL) {
fseek(file, 0, SEEK_SET);
fread(fileBuffer, fileSize, 1, file);
} else {
printf("Could not open file :(");
}
fclose(file);
printf("\n%s", fileBuffer);
assignBlocks(fileBuffer, node, fileSize/512);
}
这里有几个问题。让我们从与您的问题有关的一个开始:
首先,fileBuffer
包含文件的内容。可以,除了printf()
的%s
需要C字符串,而不是文件的内容。区别在于,C字符串以空字节\0
结尾。
然后,您假设文件仅包含文本。如果文件是二进制文件,尤其是在某个位置包含空字节的文件,则无法打印。
如何解决两个问题:使用fwrite()
,不需要空字节:替换
printf("\n%s", fileBuffer);
with
fwrite("\n", sizeof("\n"), 1, STDOUT); fwrite(fileBuffer, fileSize, 1, STDOUT);
接下来,假设文件大小。如果文件大小为16MB,则尝试在堆栈上分配16MB的内存,这会使程序崩溃。
如何解决:要么断定假设(if (fileSize > SOMETHING) return;
或类似的东西,要么用fileBuffer
动态分配malloc()
。
接下来,您没有处理fread()
中的错误。如果失败,fread()
将返回0。
如何解决:防弹方式是像这样的循环:
while (!feof(file)) { fread(fileBuffer, fileSize, 1, file); }
但是,如果您的文件可能很大,
fread()
可能只读取其中一部分,则您需要:
n = 0; while (!feof(file)) { r = fread(fileBuffer + n, 1, fileSize, file); n += r; }
注意,当您写文件时(假设是在
assignBlocks()
中,如果使用fwrite()
,还需要一个类似于fread()
的循环。
[最后,我猜想fileSize/512
应该是文件中扇区的数目,但是如果文件长1500字节,它将具有3个扇区,而fileSize/512
的取值为2。
如何解决:用fileSize/512
替换(fileSize + 511) / 512
。