fputc不工作,推进文件指针太远了

时间:2015-02-25 01:13:09

标签: c file-io

我有以下C函数:

int vacateDir(const INODE *pParDirInode)
{
  FILE *fp = fopen("fs560", "rb+");
  if (fp == NULL) {
    fprintf(stderr, "Parent directory could not be opened.\n");
    return 0;
  }

  int i;
  char line[MAX_ENTRY_LENGTH];

  // Move the file pointer to the start of the directory's first data block.
  fseek(fp, DATA_SECTION_HEAD+BLOCK_SIZE*pParDirInode->directBlocks[0] , SEEK_SET);

  // Advance the file pointer to the first real entry of the directory.
  for (i = 0; i < 4; i++) {
    line[0] = '\0';
    fgets(line, MAX_ENTRY_LENGTH, fp);
  }

  printf("The file pointer is now at %lx.\n", ftell(fp));
  printf("fputc returned %d.\n", fputc(0, fp));
  printf("The file pointer is now at %lx.\n", ftell(fp));

  // Alternative approach, which doesn't work either.
  //char x[1];
  //x[0] = 0;
  //fwrite(x, 1, 1, fp);

  fclose(fp);
  return 1;
}

我期望这个函数要做的是将0写入单个字节并将文件指针前进一个。我已经使用第一个printf语句和hexdump验证了文件指针位于fputc调用之前的正确位置。

发生的情况是,预期的字节不会更改为0,文件指针会跳过4081字节。指示的fputc返回值为0,这是我所期望的。 (EOF在我的系统上是0xFF,因此我不认为它会返回错误。)以下是输出:

The file pointer is now at 2f247.
fputc returned 0.
The file pointer is now at 30238.

通过更改写入65(A)的字符,我已经确认有一个字符被写入0x30237。我也试过使用putc,并在r +模式下打开文件,既没有任何效果。

我真的很想知道这里发生了什么,以及如何解决它。我在here这样的地方查看了有关fputc的可用文档,但我没有看到任何这个问题的原因。

1 个答案:

答案 0 :(得分:1)

好的,好的工作,团队! (说真的,谢谢。)

以下是我的工作:

int vacateDir(const INODE *pParDirInode)
{
  FILE *fp = fopen("fs560", "rb+");
  if (fp == NULL) {
    fprintf(stderr, "Parent directory could not be opened.\n");
    return 0;
  }

  int i, pos;
  char line[MAX_ENTRY_LENGTH];

  // Move the file pointer to the start of the directory's first data block.
  fseek(fp, DATA_SECTION_HEAD+BLOCK_SIZE*pParDirInode->directBlocks[0] , SEEK_SET);

  // Advance the file pointer to the first real entry of the directory.
  for (i = 0; i < 4; i++) {
    line[0] = '\0';
    fgets(line, MAX_ENTRY_LENGTH, fp);
  }

  pos = ftell(fp);

  fseek(fp, pos, SEEK_SET);
  fputc(0, fp);
  printf("The file pointer is now at %lx.\n", ftell(fp));

  fclose(fp);
  return 1;
}

我相信fflush的一些应用也会起作用。

所以我从这个问题中得到的教训是,如果你从文件中读取(比如我使用fgets和ftell)然后写入文件(就像使用fputc一样),你必须调用fseek并重置位置。文件指针。