如果一个文件在C中有EOF作为内容,我如何将它复制到内存中?

如果一个文件在C中有EOF作为内容,我如何将它复制到内存中?,c,fonts,C,Fonts,我正在尝试将C中的字体文件(.ttf)复制到内存位置。但是字体文件的内容是FF,即EOF的十六进制代码。因此,它只在遇到这个字符并终止之前进行复制。如果我将循环条件更改为文件和副本的大小,程序将挂起 [评论更新:] 代码: 您应该能够区分正在使用的返回有符号值-1(通常用于指示没有更多字符可读取)的函数和0中的无符号值。。255,表示文件的实际内容 由于unsigned char只能表示后一个范围,因此read函数通常使用int作为返回值。如果值为-1,则表示EOF,如果值为0。。255则可以

我正在尝试将C中的字体文件(.ttf)复制到内存位置。但是字体文件的内容是FF,即EOF的十六进制代码。因此,它只在遇到这个字符并终止之前进行复制。如果我将循环条件更改为文件和副本的大小,程序将挂起


[评论更新:]

代码:


您应该能够区分正在使用的返回有符号值-1(通常用于指示没有更多字符可读取)的函数和0中的无符号值。。255,表示文件的实际内容

由于
unsigned char
只能表示后一个范围,因此
read
函数通常使用
int
作为返回值。如果值为-1,则表示EOF,如果值为0。。255则可以(安全地)将结果转换为
无符号字符
,即使该值为
0xff

注意:严格来说,实际的EOF字符是ASCII格式的0x04。它实际上从未作为EOF标记出现在文件中,尽管在DOS系统中,文本文件通常以最后的
^Z
(0x1a)字符结尾,这是DOS的等效字符

编辑我看到您正在使用
fgetc
。这确实会返回一个
int
,因此您需要确保返回值在比较之前存储在
int
中,但在存储之前转换为一个
无符号字符

int a, i = 0;
while ((a = fgetc(font)) != EOF) {
    *loadAdd++ = (unsigned char)a;  // cast probably superfluous
    i++;
}
EDIT2以获得更高的性能,但与原始问题无关:

int i = 0, n = 0;
while ((n = fread(loadAdd, 1, 4096, font)) > 0) {
    loadAdd += n;
    i += n;
}

注意:无论使用哪种实现,您都必须确保由
loadAdd
的初始值指向的内存缓冲区实际上足够大,可以接收整个文件。

请显示打开和读取文件的代码。@PaulRoub
code
do{a=fgetc(font);memcpy(loadAdd,&a,1);i++;loadADD++;}while(a!=EOF);fclose(字体);请在问题中包含代码,并显示正在打开的文件。另外,什么类型的
a
?您可能想(重新?-)阅读
fgets()
文档并了解
fgets()
返回一个
int
@PaulRoub我真的很抱歉。我不被允许这样做,因为我正在做一些机密的事情。无论如何,这是一个字体文件。ttfOh但是我也用-1试过了,没有任何改变!您没有显示
a
,但我假定您已将其声明为
char
。不要-将其声明为
int
,然后只需说
*loadAdd=(unsigned char)a
@Prash-oh,并且
在获得
EOF
后立即将其从循环中中断-您不需要(或想要)将
0xff
存储在内存缓冲区中。谢谢。我正在尝试你的代码。因为要复制的文件是1MB,所以需要很长时间。将让您知道它是否有效。:)@Prash一个更干净的实现将使用
fread()
,一次获取文件的块,而不是一次获取一个字节。请参见编辑。
int i = 0, n = 0;
while ((n = fread(loadAdd, 1, 4096, font)) > 0) {
    loadAdd += n;
    i += n;
}