2012-07-14 120 views
2

特定行我有大约2000,我在我的程序生成的文本行的文件,每行有一个员工的信息,它的outputed这样覆盖在C

11艾​​萨克·丰塞卡58℃1600 1310.40 6 1 0.22 2164.80 1
2 1曼努埃尔Gutierrez的22 d 1700 1523.37 4 1 0.13 897.26 1
3 1丹尼尔贝纳尔34 C 1600 1195.84 2 1 0.26 836.16 1
4 1米格尔冈萨雷斯部43e 1800 1195.84 0 1 0.15 0.00 1

但我每当我编辑员工信息我必须更新文件,我在做什么这是我搜索该行,并尝试重写它

我见过以下问题的人有同样的问题,但是当我尝试写入文件时,它始终写入文件

overwriting a specific line on a text file?

这里到底是我的代码:

datos = fopen(archivo,"a+"); 
for(i=0;i<num;i++){ 
    // buscar la linea 
    fgets(lineaA,100,datos); 
    // sobreescribir 
    if(i == (num-1)) 
     cursor = ftell(datos);      
} 

cursor -= strlen(lineaA) - 1; 
fseek(datos,cursor,SEEK_CUR); 

fputs(linea2,datos);    
fclose(datos); 
+2

这是棘手的 - 'a +'打开追加,这不是你想要的。也许'r +',或者你必须使用不同的打开命令。但我从来没有试过这样做。 (请注意,您需要覆盖原始行的相同字节数。) – 2012-07-14 22:36:52

+0

@HotLicks将其更改为“r +”,并且它附加到代码中的特定行,现在我只需要重新计算我的游标位置,并使其删除其他内容,因为它只是追加它,它不会覆盖它 – 2012-07-14 22:43:34

回答

3

你几乎不能做到这一点。

您可以使用fseek转到文件中的特定位置,并且可以将数据写入该位置(您可能希望使用"r+"模式)。

但是文件通常以字节序列(或字符)存储,而不是作为一系列行。

如果你仔细写出已经在该行中的完全相同的字节数,你可能会得到它 - 但在你的例子中,行的长度是不同的,所以这不是一个选项。

例如,您可以用空白填充每行,所以它们的长度都是相同的,但是如果使用普通的文本编辑器修改文件,则很容易破坏布局。

对于文本文件,通常的做法是将文件读入内存,修改内存中的表示形式,然后重新创建整个文件。您可能希望将内容写入新的临时文件,然后在确认没有写入错误后重命名它。

这是文本编辑通常会做的事情。

(不要太担心效率; 2000线是不是所有的大,你不会注意到它需要给他们写的时间。)

还有其他选择。您可以定义具有固定长度记录的二进制格式,也可以使用数据库。或者,您可以将新行添加到文件中,并将一样视为已被删除(但如果进行大量更新,则会导致文件变大)。

+0

你可以命名任何文本编辑器,遵循你惯常的apparoch? – overexchange 2017-01-02 03:22:20

+0

@proxchange:vim,emacs – 2017-01-02 07:25:06

0

你通过选项“打开文件+ “,其中y允许你追加到文件中,而不是覆盖。你想用“r +”

datos = fopen(archivo,"r+); 
1

除非这是类似于家庭作业的事情,您需要自行滚动所有代码,否则切换到数据库可能是最容易的。鉴于你有其他的代码工作,SQLite可能是最明显的选择。如果你真的想坚持(至少类似于)你当前的格式和代码,我可能会写入每行填充64或128字节的数据(如果你有几条记录更长时间,隔离它们,例如将它们全部移到文件的末尾,或将它们放在单独的文件中)。这种方式(大多数?)编辑可以在不影响其他行的情况下完成。如果你有一个雇员的行的索引,你也可以直接找到该行,而不是阅读所有的前辈找到它。

+0

这是一个家庭作业,所以我必须这样做,我会更喜欢使用数据库 – 2012-07-14 23:05:37