2

我试图编写一个代码,其中:

  %# Matlab reads a notepad file.

  f_id=fopen('n1.txt','r');
  reports=textscan(f_id, '%s', 'Delimiter', '\n')
  fclose(f_id)
  reports_saved=reports{1} ;
  P='blah blah'

编辑:

 goes to a specific line of the text file.
X=ftell(f_id)
Ai=fseek(f_id, 0, 'cof')
 fprintf(f_id,'%s', P);
 fclose(f_id)

'cof' 指针被覆盖的第一行。现在,问题 1:如果新文本比现有文本短,则现有文本中的字符在覆盖后仍然存在。任何提示为什么?问题 2: 'fseek' 只允许转到文件的开头、当前位置或结尾。有什么方法可以让指针像转到文本 no4 /5 一样随机移动。请注意,每个文本之间都有一个空行。

任何帮助表示赞赏。

4

2 回答 2

3

文本文件是磁盘上的一组连续字节。如果更改文件中间的任何一段文本的长度,则需要重写文件的所有后续字节,然后截断或扩展文件。它们不会自动转移。这就像从内存中的数组结构中插入或删除(在像 C 这样的低级语言中,它不会像 Matlab 那样自动调整数组的大小),而不是链表。

直接使用文件可能是错误的方法。Matlab 甚至不提供 ftruncate() 函数,您需要在用较短的文本替换文本后缩短文件。只需将整个文件读入内存中的数组,在那里对其进行操作,然后用 fopen(...,'w') 将整个文件写回,替换原始文件。如果您正在进行面向行的更改,那么使用 cellstr 行数组可能会比使用嵌入行分隔符的大 char 数组更容易。

于 2011-02-28T20:07:28.810 回答
2

尝试使用'r+'. 'w'只会创建一个新文件并删除旧文件中的所有内容(如果存在)。

f_id=fopen('fire.txt','r+');

于 2011-02-28T01:17:16.413 回答