0

我正在尝试以块大小BLOCK_SIZE(当前等于1000 unsigned chars)将文件读入缓冲区。我的代码最初找到它必须读取的块数才能读取整个文件(通常是 2-4),然后遍历一个 for 循环读取文件(忽略“ +17+filenamesize”的东西,这都是以后需要的该程序。

但是,只有在第一次时j=1,它才会真正将数据放入buf数组中。在其他情况下,当j != 1,strlen(buf)返回0

fseek()我认为问题在于在读取文件之前使用寻找文件的第二部分或内存分配问题。

任何帮助将不胜感激让它将文件的1000-1999第 th 个字符读入buf数组。

附上代码的相关部分:

unsigned char *buf;
source = fopen(localpath,"r");
temp = filesize / BLOCK_SIZE + 1;

for (j=1; j <= temp; j++) {
  if (j == 1) {
     buf = (unsigned char *) malloc((sizeof(unsigned char)) * (BLOCK_SIZE + 17 + filenamesize));
     fread(buf+17+filenamesize, sizeof(unsigned char), BLOCK_SIZE, source);
   } else if (j == temp) {
     buf = (unsigned char *) malloc((sizeof(unsigned char)) * (filesize + 5 - BLOCK_SIZE*(j-1)));
     fseek(source, BLOCK_SIZE*(j-1), SEEK_SET); // off by one warning
     fread(buf+5, sizeof(unsigned char), filesize - BLOCK_SIZE*(j-1), source);
   } else {
     buf = (unsigned char *) malloc((sizeof(unsigned char)) * (5+BLOCK_SIZE*(j-1)));
     fseek(source, BLOCK_SIZE*(j-1), SEEK_SET); // off by one warning
     fread(buf+5, sizeof(unsigned char), BLOCK_SIZE, source);
   }
   // do stuff with buf here

   buf = "";
   free(buf);
}
4

4 回答 4

3

我建议检查fseekfread的结果。特别是,确保 fseek 返回 0 - 如果不是,这可能是整个问题。

如果 fseek 成功, fread 应该告诉您读取的字节总数。

此外, strlen 不一定是一个有效的东西,因为它会假设这是一个以空值结尾的字符串。如果您读取的第一个字符是 0 字节,则 strlen 将返回 0。您不会将其视为空终止字符串(您没有为空终止符分配足够的空间 - 正是适合您的二进制数据所需的空间) ,所以 strlen 可能是不合适的。

于 2009-07-24T20:09:37.453 回答
2

这条线buf = "";对我来说就像一个错误。这会将指针 buf 设置为一个常量字符串,您也可以free()在下一行尝试使用它。我会跳过这一行。

您似乎还用一些偏移量读入了缓冲区。即在后两种情况下+5。缓冲区中的第一部分将是未定义的,请参见手册页malloc。所以 astrlen(buf)对我来说是不确定的。

于 2009-07-24T20:24:16.253 回答
1

你为什么要使用 fseek 呢?“首先检查文件有多大以确定读取块的次数”的整个概念从根本上是有缺陷的。您应该简单地读取数据,直到没有更多数据为止,例如:

而(BLOCK_SIZE ==(read_count = fread(buf,sizeof *buf,count,source))
    do_stuff_with_buf(buf, read_count);

如果(错误错误(来源))
    /* 处理错误 */;

(这个例子永远不会在短读时调用 do_stuff_with_buf(),但这是一个微不足道的修改。)

于 2009-07-24T22:25:29.753 回答
0

srtlen 返回字符串的长度(第一个 0 字节之前的字节数)。如果 buf[0] 为 0,则返回 0。使用 fread 的返回值来确定实际读取了多少字节。

你也有内存泄漏。您在每次循环迭代中进行 malloc,但最后只释放一次。

于 2009-07-24T20:08:37.923 回答