我有以下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的可用文档,但我没有看到任何这个问题的原因。
答案 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并重置位置。文件指针。