-2

我想在已经存在的文件中的特定位置写一些东西,但我想在写新内容之前,擦除这个位置的旧内容。

例如,假设以下是目标文件的内容。

27013.
Anderson Alston.
22.
9 Hall st.
25/7/2013.
0.      << target position here

现在,修改后的文件内容将是

27013.
Anderson Alston.
22.
9 Hall st.
25/7/2013.
190.    << this position has been modified

最后,以下是我编写的代码。

cout << "Amount of deposit: ";
cin >> amount;
ofstream ifile("file.txt", ios::out|ios::trunc);
ifile.seekp(pos); // `pos` is variable that stores the position
ifile << amount << ".";
ifile.close();
4

4 回答 4

3

不能直接在文件中间插入数据,就像不能在数组中间插入数据一样。您必须在插入点之后移动所有内容,以便为新数据腾出空间。

一般来说,我认为使用这样的文件是个坏主意。读入文件,执行您需要的任何处理,然后将整个文件写回。此外,您可以避免以这种方式轻易损坏文件。

于 2013-08-04T02:48:05.223 回答
2

您不能以这种方式将数据插入文件。

文件是一组连续的字节,要将附加数据引入特定区域需要您为新内容“腾出空间”。这是通过分配更多空间然后移动值来实现的,以便您可以写入所需的位置。

我当然不建议转移(读/写)文件本身的字符。将文件的内容读入 char 缓冲区,在其中可以更轻松地操作数据。您可能会考虑使用 char 数组的数组,因此每行都有一个 char 数组。这样,您就可以逐行操作数据,并在所有修改完成后写回文件。

于 2013-08-04T03:44:09.610 回答
0

好了,希望能给你一个答案……

首先,您必须知道您在问题中所要求的只是部分可能的。我的意思是,

一种。您可以更改文件的记录而不将整个文件读入内存,但是

湾。您不能在不移动其他记录的情况下将新记录插入文件中间。

要执行上面的任务'a',您必须简单地使用搜索功能到所需位置,然后更新记录。

要做任务'b',因为你是初学者,最好使用数组。我不会在这里为你编写整个代码。如果这就是你想要的,你宁愿上我的课也不愿上你的C 课:)

所以这里有一个粗略的算法。

要插入记录:

Input data
Open the file to append. (alternatively you may seek to the end of the file)
Write the record
Close the file.

编辑记录。

Input a record item to search. Eg: ID or name or something unique.
Open the file (for read/write)
RecordNum = 0
found = false
While not eof and not found
  Read record
  If match found
    found= true
    display info so you can see the data
    input new fields (changes)
    seek to postion RecordNum
    Write the record to the position.
  Else
    Increment RecordNum
  End if
End while
if not found show error or something you like.
close file

在上述方法中,您必须使用类型化文件。这意味着您必须为每条记录定义一个记录结构(使用结构)。

于 2013-08-04T04:04:10.583 回答
-1

您可以像这样打开文件:

fstream ifile("file.txt", ios::in | ios::out);
于 2015-02-05T23:02:47.773 回答