2011-02-28 70 views
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) 

第1行,其中 'COF' 指针结束写入。现在,问题1:如果新文本比现有文本短,则在覆盖后保留现有文本中的字符。任何暗示为什么? 问题2:'fseek'只允许转到文件的开始,当前位置或结束。有什么办法让指针随机移动,就像去文本no4/5一样。请注意,每个文本在它们之间都有空行。

任何帮助表示赞赏。

+0

@Jacob,@ Andrew,r +肯定有用。我指的是遗留以前文本中的单词的问题。如果文本的长度不相等,那么正如安德鲁所描述的那样,这是可以做到的。否则,我找到了一个正在做我想要的Matlab帮助。 http://www.mathworks.com/support/tech-notes/1600/1602.html – Tinglin 2011-03-01 00:03:48

回答

3

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

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

2

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

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

+0

我想,你的意思是,阅读和写作的许可。 'r +'在Matlab中找不到'rw'。不幸的是,它没有提供所需的输出。 – Tinglin 2011-02-28 01:28:20

+0

我曾在文件中:Sillicon谷歌,谷歌地球和ipad 1.之后,执行,似乎,silblah blah Google earth ipad1,所以,我想,fseek的偏移量需要设置为0但是,现在的问题是,如何修改任何文本。 fseek有三种选择,bof,cof和eof。有没有办法可以获得'cof'的随机值并覆盖文本? – Tinglin 2011-02-28 01:43:28

+0

找到'rt'。道歉。 – Tinglin 2011-02-28 03:24:33