0

编辑:当我更改工作目录时它可以工作,因此文件是在不同的目录中创建的。我之前使用的目录唯一奇怪的是它是一个与 VirtualBox 一起使用的共享目录。这一直是 VirtualBox 的错误吗?我最好开始使用单独的目录。

我有一个非常奇怪的问题。在我的程序的某个地方,我有这个代码。我已经对其进行了修改以打印出一些信息来证明问题:

uint8_t section[9];
long pos = ftell(rd);
fseek(rd, 0, SEEK_END);
printf("%li\n",ftell(rd));
fseek(rd, pos, SEEK_SET);
printf("%li\n",ftell(rd));
clearerr(rd);
int i = fread(section, 1, 9, rd);
if (i != 9){
    printf("%i - %i - %i\n",i,feof(rd),ferror(rd));

输出是这样的:

23
14
0 - 0 - 1

所以此时文件的长度为 23,光标为 14。我想要 9 个字节,但 fread 给出零并出现错误。我在 Linux Mint 而不是 OSX 上遇到了这个问题。其他人在debian上似乎没有这个问题。我不知道是什么导致了这个问题。有没有办法进一步诊断错误的原因?ferror() 给出零信息。

该文件以“wb+”模式打开。

编辑:

我在 valgrind 中发现了这个晦涩的错误:

==22141== Syscall param write(buf) points to uninitialised byte(s)
==22141==    at 0x5B68900: __write_nocancel (syscall-template.S:82)
==22141==    by 0x5AFB882: _IO_file_write@@GLIBC_2.2.5 (fileops.c:1289)
==22141==    by 0x5AFB749: new_do_write (fileops.c:543)
==22141==    by 0x5AFCEB4: _IO_do_write@@GLIBC_2.2.5 (fileops.c:516)
==22141==    by 0x5AFDD3E: _IO_switch_to_get_mode (genops.c:189)
==22141==    by 0x5AFBA96: _IO_file_seekoff@@GLIBC_2.2.5 (fileops.c:999)
==22141==    by 0x5AF4F25: rewind (rewind.c:37)
==22141==    by 0x567D149: CBFileAppend (CBFileEC.c:69)
==22141==    by 0x5473AFA: CBDatabaseCreateDeletionIndex (CBDatabase.c:270)
==22141==    by 0x5473195: CBInitDatabase (CBDatabase.c:112)
==22141==    by 0x54721A1: CBNewAddressStorage (CBAddressStorage.c:37)
==22141==    by 0x401F67: main (testCBAddressManager.c:226)
==22141==  Address 0x402a009 is not stack'd, malloc'd or (recently) free'd
==22141==  Uninitialised value was created by a stack allocation
==22141==    at 0x546F750: ??? (in /media/sf_BitEagle_Projects/cbitcoin/bin/libcbitcoin-storage.2.0.so)

不知道在哪里???很明显,所以我没有进一步调试这个的运气。这很奇怪,因为它在 rewind() 中抱怨。

谢谢。

4

2 回答 2

2

根据文档,“wb+”会破坏现有文件的内容:http: //en.cppreference.com/w/c/io/fopen。当您尝试使用“rb+”时,您必须首先重新创建文件,否则您会遇到与使用“wb+”打开该文件时相同的问题。

编辑:这是您的完整示例代码的样子吗?

int main()
{
  typedef unsigned char uint8_t;

  FILE * rd = fopen("foo.tmp", "wb+");
  uint8_t section[9] = {0};
  long pos = 0;

  fprintf(rd, "01234567890123456789012");

  fseek(rd, 14, SEEK_SET);
  pos = ftell(rd);
  fseek(rd, 0, SEEK_END);
  printf("%li\n",ftell(rd));
  fseek(rd, pos, SEEK_SET);
  printf("%li\n",ftell(rd));
  clearerr(rd);
  int i = fread(section, 1, 9, rd);
  if (i != 9){
    printf("%i - %i - %i\n",i,feof(rd),ferror(rd));
  }

  return 0;
}
于 2013-02-03T19:03:42.807 回答
0

您可能不会相信这一点,但这确实是 VirtualBox 和共享目录的问题。构建过程在普通目录上运行良好。感谢所有试图提供帮助的人。我以前没有使用过 strace,但我会记住这一点!最后我确实得到了 strace-plus 的工作,这可能有一天会证明是有用的。

于 2013-02-03T22:43:15.453 回答