c - 在随机访问文件中覆盖

标签 c linux file

我有一个以“r+b”模式打开的随机访问文件,其中的记录长度相等。我可以在读取记录并覆盖后更改记录的内容吗?

我尝试了以下代码,但在运行时我得到:段错误(核心已转储)

#include<stdio.h>

int main()
{
   struct tala {
      int rec_no;
      long file_no;
   };
   FILE *file_locking;
   struct tala t,f;
   file_locking = fopen("/path/to/my/file.bin", "rb+");
   t.rec_no = 1;
   t.file_no = 3;
   if (fwrite(&t, sizeof(struct tala),1,file_locking)==0)
      printf("Error opening file");
   t.rec_no=0;
   rewind(file_locking);
   if (fwrite(&t, sizeof(struct tala),1,file_locking)==0)
      printf("Error opening file");
   rewind(file_locking);
   if (fread(&f, sizeof(struct tala),1,file_locking)==0)
      printf("Error opening file");
   printf("\n %d",f.rec_no);
   printf("\n %ld", f.file_no);
   fclose(file_locking);
}

最佳答案

是的,你可以。请记住在读取和写入之间始终fseek

引用 fopen 手册页:

Reads and writes may be intermixed on read/write streams in any order. Note that ANSI C requires that a file positioning function intervene between output and input, unless an input operation encounters end-of-file.

额外提示:总是检查fopen和相关函数的返回值,并处理错误(使用perrorstrerror 打印出失败的内容)。

关于c - 在随机访问文件中覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6006963/

相关文章:

使用 argp 库完全隐藏选项

php - 合并音频文件

c# - 如何在使用 Excel 文件导出文件时在 C# 中使用数据注释验证

java - 将文件(.zip、.jar、...)下载到文件夹

C 宏 - 如何将整数值转换为字符串文字

C 编程 - 为什么我的结构中存在垃圾数据?

c++ - 启用和禁用 USB 端口

c - 双链表递归的问题

linux - 用于监视 Gentoo 上的 nginx 日志文件的 shellscript 在日志文件被 gzip 后过期

c++ - 在文件中维护链表