如何在特定位置写入文件?

时间:2013-10-30 12:11:37

标签: c file

我有一个家庭作业,我们必须使用.txt文件。

这是我的文件示例:

约翰福音1234 558
2 Myke 2222 9876
...

我想覆盖文件中的558号码。给出了ID(1,2 ......)。我一直在搜索,fopen()函数只提供开始和追加的参数。

5 个答案:

答案 0 :(得分:5)

您可以使用fopen(" filename"," r + b")打开文件进行更新(以二进制模式)。 然后,您可以使用fseek设置下一个要编写的内容,并使用fwrite / fputs或类似内容来更新数据。

例如,假设你从文件 test.text 开始,看起来像这样

0123456789abcde
0123456789abcde
0123456789abcde

您可以使用以下程序

#include <stdio.h>
int main(int argc, char **argv)
{
  FILE *f;
  if(!(f = fopen("./test.text", "r+b"))) //open the file for updating
    return -1;
  fseek(f, 16, SEEK_SET);//set the stream pointer 16 bytes from the start.
  const char message[] = "Hello, World!";
  fputs(message,f);
  return 0;
}

,结果将是

0123456789abcde
Hello, World!de
0123456789abcde

您仍然需要首先在文件中搜索要替换的ID,并且当您想要替换&#34; 558&#34;时,您可能会遇到问题。用&#34; 12345&#34;除非线上有额外的空格来填充输出。因为你将开始覆盖下一行的数据。

答案 1 :(得分:2)

fopen打开文件,然后seek到正确的位,然后写相应的位,小心不要覆盖你不想覆盖的文件中的任何内容!

如果您需要插入的数据超过现有文本所占用的数据,那么您必须从该点重新附加其余文件内容。

答案 2 :(得分:1)

有些函数可以搜索文件中的给定位置,但此位置是文件中的字节偏移量。您事先不知道偏移量,因此您需要每行读取文件行,直到找到具有给定ID的行。然后你可以跳过名字,第一个数字,你在558.现在的问题是你可以覆盖文件中的558,但你不能写12并从558删除8你也不能用558替换558 1234,因为你会用123覆盖558并需要插入4。

一个简单的解决方案是使用第二个文件。您可以每行读取文件1行并将每行复制到文件2.尽管具有给定ID的行。您可以在将该行写入文件2之前修改该行。

如果您知道如何操作,您还可以使用大缓冲区并在文件1中进行替换,而无需第二个文件。

如果允许您使用两个文件,则应该这样做。如果文件很短并且允许您将完整文件读入内存,则可以读取该文件,在内存中进行修改并写回文件。

答案 3 :(得分:1)

通常更容易重写整个文件。您必须具有阅读和写作功能。所以你看,修改内存中的数据结构,然后再把所有内容写出来。

答案 4 :(得分:0)

(假设你的.txt文件包含上面提到的4个字段)你可以有两个FILE指针,一个具有读权限,另一个具有写权限。假设你的文件名为xyz.txt,让fp_read读取访问权限指向它,让fp_write指向一个新文件xyz_bkp.txt。

<强>变量
char * curr_line,* name;
int id,second_num,third_num;

这里的技巧是将xyz.txt文件逐行读入字符串(比如curr_line) 然后使用sscanf将行中的值读入不同的变量。例如- sscanf(curr_line,“%d%s%d%d”,&amp; id,name,&amp; second_num,&amp; third_num);

现在根据变量的值,无条件地将值写入xyz_bkp.txt文件或根据您的意愿更改它们。

注意:完成后,您需要删除原始xyz.txt 将xyz_bkp.txt重命名为xyz.txt (很简单)