如何在C中使用stdio在文件中正确移动搜索指针

时间:2015-01-16 12:57:46

标签: c file random-access

我在C中乱用搜索指针,我的练习是将数据库(格式:ID NAME SURNAME AGE)写入文本文件。 所以一切正常(保存新数据等),但我找不到如何删除文本文件中的行的解决方案。

void cut_from_file(char* filename, int start, int stop) {
    FILE *fp = fopen(filename, "w");
    fpos_t position;
    fseek(fp, 34, SEEK_SET);
    fputs("Hello world", fp);
    fclose (fp);
}

注意:我想以某种方式使其成为随机访问文件。

所以我的问题是如何移动文件指针让前面说34个字符并覆盖该位置上的字符,但保留0到33位的字符呢?

如果我在上面的测试功能中尝试这样做,我会使用' / 00'覆盖偏移0 - 33中的所有内容。在第34位是Hello World。

5 个答案:

答案 0 :(得分:3)

fopen(文件名," r +")就是答案,天哪我搞砸了。

谢谢大家:)

答案 1 :(得分:1)

使用SEEK_CUR代替SEEK_SET从当前索引向前移动。 SEEK_SET从文件开头向前带你34个字符。还" w"在打开文件时会覆盖其所有内容。

答案 2 :(得分:1)

没有办法简单地让文件的一大块消失。

我可以看到两种可能的解决方案:

  1. 读入整个文件,将其写出并跳过您要删除的行。
  2. 使用额外的字节(和固定宽度的记录!)来指示条目是否被删除"或"未删除"。这意味着删除记录只需一次写入,然后您就知道可以将该空间重新用于另一条记录。

答案 3 :(得分:0)

要从文件中删除一行,您可以打开一个临时文件并逐行写入内容,然后跳过要删除的行,以后可以用临时文件替换原始文件。 / p>

答案 4 :(得分:0)

(1)将最后一个条目移动到要删除的条目。 (2)调用truncate缩短文件。