我正在开发一个休假管理系统,我已经将员工的详细信息写入了一个文本文件,但是现在我想通过将员工ID作为输入将休假类型添加到特定行的末尾。
James720 | Name: James | Department: Administration | Leave Balance: 30
Kyle790 | Name: Kyle | Department: Administration | Leave Balance: 30
这就是我写入文件的方式(见上图)
目标是:
x一个一个一个一个x一个一个二个x
我尝试了此操作,但更新的文本文件为:
JMedical0 | Name: James | Department: Administration | Leave Balance: 30
Kyle226 | Name: Tariq | Department: Management | Leave Balance: 30
如上所示,单词Medical被添加到开头以替换ID
1条答案
按热度按时间92vpleto1#
您的方法将不起作用,因为您的方法只允许您覆盖文件的一部分,而不允许插入任何内容。
另一个问题是在标准C中
不允许,因为您是以文本模式打开文件的。在文本模式下,
fseek
的唯一合法偏移量是0
或上一次调用ftell
的返回值。有关详细信息,请参阅fseek
的the documentation。但是,如果您使用的是POSIX平台(如Linux),则这些限制不适用,允许使用此行。虽然是some file systems do support inserting data into the middle of a file,但这并不容易,而且一般要求插入的数据块是某个大小的倍数,因此,我不建议您使用这种解决方案。
写一个添加了所需数据的新文件会更容易一些。如果你愿意,你可以删除旧文件,然后用旧文件的名字重命名新文件。
我建议您打开两个文件,一个输入文件
"staff.txt"
和一个输出文件"staff_new.txt"
。以"r"
模式打开输入文件,以"w"
模式打开输出文件。注意,这将覆盖文件"staff_new.txt"
。请不要对任何文件使用"r+"
或"w+"
。然后,您可以使用fgets
逐行读取输入文件(正如您已经在做的那样),然后将该行复制到输出文件中。之后,您可以在开始复制下一行之前,将所需的所有信息添加到输出文件中。下面是一个例子:
请注意,在上面的程序中,我没有像您在问题中那样使用带有
%s
说明符的scanf
,因为这样只能读取单个单词,而不是整行。此外,通常不推荐使用scanf
作为用户输入。根据我的经验,通常使用fgets
会更好,我为此创建了函数get_line_from_user
,它会自动删除换行符并执行额外的输入验证,我还创建了一个类似的函数get_line_from_stream
,它也会自动删除换行符,但在输入错误时不会重新提示用户,第二个函数用于从文件中读取,而不是从用户那里读取。此程序具有以下行为:
当用户输入
并且
staff.txt
的含量为则将以下输出文件写入
staff_new.txt
: