我有这样的功能:
int GetBytes(char *loc, int Bytes)
{
int BytesRead=0;
int j = 0;
int i = 0;
int fileloc = 0;
unsigned char TmpLoc[500];
unsigned char TmpLoc1[500];
strcpy(loc,"");
Bytes = Bytes / 2;
BytesRead = fread(TmpLoc, 1, Bytes,PrcFile);
/*Start of conversion*/
if (ebcidic_flag[0] == 'Y')
{
for (i=0; i < BytesRead; i++)
{
j = i * 2;
sprintf(TmpLoc1, "%x", TmpLoc[i]);
if (strlen(TmpLoc1) < 2)
{
strcat(&loc[j], "0");
j++;
}
strcat (&loc[j],TmpLoc1);
}
}
for (i=0;i<(BytesRead*2);i++)
{
if ((loc[i] >= 0x60) & (loc[i] <= 0x7a))
loc[i] = loc[i] & 0xdf;
}
/*End of conversion*/
TotalBytes = TotalBytes + BytesRead;
return (BytesRead * 2);
}
当我评论转换逻辑时,fread
读取整个文件的问题。
但是当激活转换逻辑时,fread
不会读取整个文件。
例如,如果我有一个30000字节的文件,它可能只读取1210字节然后返回零。
我的转换逻辑有问题吗?
根据要求确切读取16382后,它只读取2个字节并返回0.我尝试了不同的文件但结果相同
答案 0 :(得分:0)
您的转换逻辑假定读取的字节数与您期望的完全相同。不幸的是情况并非如此。因此,在循环中,您需要将其更改为查看实际读取的字节:
for (i=0;i<BytesRead;i++)
和
for (i=0;i<(BytesRead*2);i++)
但除此之外,因为输入/输出是缓冲的,无论如何您可能无法获得所需的所有字节。因此,最好的做法是将fread本身放入循环中,以便检测实际结束的时间,而不是假设您可以一次性读取它:
int TotalRead = 0;
int BytesRead;
while(TotalRead < Bytes && (BytesRead = fread(TmpLoc, 1, Bytes - TotalRead,PrcFile)) > 0) {
/* do your converting and needed stuff here */
TotalRead += BytesRead;
}
这样你就会继续读到文件的末尾。或者,当然也可以检查大多数字节的读数。