檔案的輸入輸出

355 views
Skip to first unread message

weianqq

unread,
Oct 25, 2009, 11:16:45 AM10/25/09
to 中文 Scilab 教育論壇
1.建立檔案應該是用file這指令吧

ex.file('open','123.txt','new')

可是如果我在接續下達

file('close','123.txt','old') 就會有error產生 這又是為什麼呢?

照理說我已建立了一個檔案 那檔案在關閉時就是old啦


2.如果我想寫入資料..

write(file-name,[變數1,變數2,變數3...],<format>)

先來說說我使用過程中所遇到的問題

首先我建立一個txt檔

-->file('open','123.txt','new')
ans =

1.

在宣告一個亂數矩陣給x

-->x=rand(3,4)
x =

0.2113249 0.3303271 0.8497452 0.0683740
0.7560439 0.6653811 0.6857310 0.5608486
0.0002211 0.6283918 0.8782165 0.6623569


寫入123.txt

-->write('123.txt','x')
!--error 240
File "123.txt" already exists or directory write access denied.


最下面那行訊息是最困擾我的 我不了解到底出了什麼事

還有關於format

write(file-name,[變數1,變數2,變數3...],<format>)

如果變數不是單純的一個a=4而是3*4矩陣 還是多項式 那格式的對應又

是什麼呢? 順帶一提如果是整數的格式是否就是 %d 小數%f ? 或者

截然不同?

3.如果我是要讀取資料..

data1 = read ( file-name, row , column, <format> )

裡面的format是指? row是行 column是列 若不了解資料情況row設為 -1全部讀取 這樣講應該沒錯吧


以下的程式碼是從助教的pdf弄上來的

4.製造資料並直接寫入txt檔

以下是助教給的範例(當然對我這第一次接觸程式的人我當然是不懂他在說啥= =)

time = 1:0.2:2;

data_sin = sin(time);

data_cos = cos(time);

title_str=['time','data_sin','data_cos'];

title_name = input('title name?','s'); //讓使用者決定檔名

title name? IOdemofile [Enter]

file_name = title_name+'.txt';

f1=file('open',file_name,'new'); //開新檔案

write(f1,title_str,'(a)'); //先寫入各攔變數標題

for i=1:size(time,2) //依序寫入一列三筆,共18列資料

write(f1,[time(i),data_sin(i),data_cos(i)],'(d,5x,e,e)');

end;

file('close',f1); //完成操作以後記得關閉檔案


初學者看這真的會眼花

有沒有更好的可表達更完整概念的範例


5.讀取4.的txt檔

f3 = file ('open','IOdemofile.txt','unknown');

file ('rewind',f3);

title1 = read(f3,3,1,'(a)');

data = read(f3,6,3,'(d,5x,e,e)')

write (%io(2),title1(1),'(''column1 = '',a)');

write (%io(2),title1(2),'(''column2 = '',a)');

write (%io(2),title1(3),'(''column3 = '',a)');

for i= 1:6,

write (%io(2),[data(i,1),data(i,2),data(i,3)],'(d,e,e)');

end;


以下式螢幕的output

column1=time
column2=data_sin
column3=data_cos
0.1000000000000000D+01 0.8414709848078965E+00 0.5403023058681398E+00
0.1200000000000000D+01 0.9320390859672263E+00 0.3623577544766736E+00
0.1400000000000000D+01 0.9854497299884601E+00 0.1699671429002410E+00
0.1600000000000000D+01 0.9995736030415051E+00 -0.2919952230128882E-01
0.1800000000000000D+01 0.9738476308781951E+00 -0.2272020946930871E+00
0.2000000000000000D+01 0.9092974268256817E+00 -0.4161468365471424E+00

所以我目前問題都在file.write.read身上

我已經被問題困擾很久了 每次問問題助教都只是"稍微提示而已"


之後就有以下的實習

1.從鍵盤輸入檔名 將英文文字檔案顯示於螢幕

2.從鍵盤輸入檔名,將英文文字檔案輸出到另一個檔案

3.將鍵盤打入的字串從螢幕輸出 不等到按enter就逐字輸出

其實聽完助教的講解我也是很難做出這三件事...

Yung-Jang Lee

unread,
Oct 26, 2009, 10:10:21 AM10/26/09
to ade-s...@googlegroups.com
Scilab 內有兩型輸入, 輸出指令 :

1. file, write,read

這一型是模擬 Fortran 語言的格式

2. mopen, mscanf, mprintf

這一型是模擬語言格式

如果能夠選擇最好是使用 C 語言這套輸入, 輸出函數. 因為未來 Scilab 的輸入, 輸出會以 第二型為主.


2009/10/25 weianqq <wei...@yahoo.com.tw>:


> 1.建立檔案應該是用file這指令吧
>
> ex.file('open','123.txt','new')
>
> 可是如果我在接續下達
>
>    file('close','123.txt','old')    就會有error產生  這又是為什麼呢?
>
> 照理說我已建立了一個檔案 那檔案在關閉時就是old啦

正確用法為 :

開啟 :

fid= file('open','123.txt','new'); // 開啟新檔

fid= file('open','123.txt','old'); // 開啟一舊檔


關閉 :

file('close',fid) ; // fid 為開啟時產生的變數


>
> 2.如果我想寫入資料..
>
> write(file-name,[變數1,變數2,變數3...],<format>)
>
> 先來說說我使用過程中所遇到的問題
>
> 首先我建立一個txt檔
>
> -->file('open','123.txt','new')
>  ans  =
>
>    1.
>
> 在宣告一個亂數矩陣給x
>
> -->x=rand(3,4)
>  x  =
>
>    0.2113249    0.3303271    0.8497452    0.0683740
>    0.7560439    0.6653811    0.6857310    0.5608486
>    0.0002211    0.6283918    0.8782165    0.6623569
>
>
> 寫入123.txt
>
> -->write('123.txt','x')
>                     !--error 240
> File "123.txt" already exists or directory write access denied.
>
>

fid= file('open','123.txt','old'); //若 123.txt 已存在時, 就需使用 'old' 或 'unknown'
x=rand(3,4);
write(fid,x); // 注意, 不是 'x'
file('close',fid);

> 最下面那行訊息是最困擾我的 我不了解到底出了什麼事
>
>
>
> 還有關於format
>
> write(file-name,[變數1,變數2,變數3...],<format>)
>
> 如果變數不是單純的一個a=4而是3*4矩陣  還是多項式 那格式的對應又
>

fid= file('open','123.txt','old');
x=rand(3,4);
write(fid,x,'(f10.2 f10.3 f10.4 f10.5)'); // 注意, 這裡使用的是 Fortran 的 format
file('close',fid);


因此可知, 可以針對一個 column 指定一個格式,


> 是什麼呢?    順帶一提如果是整數的格式是否就是 %d  小數%f ?  或者
>
> 截然不同?
>

%d , %f 是 C 語言所用的個格式, 若熟悉這種格式 你該使用 mopen, mclose, mscanf 等系列函數


>
>
> 3.如果我是要讀取資料..
>
> data1 = read ( file-name, row , column, <format> )
>
> 裡面的format是指?    row是行  column是列  若不了解資料情況row設為  -1全部讀取   這樣講應該沒錯吧
>

這能一次讀入一個矩陣資料, 必須確定檔案內部皆為很規則排列的數據,


你也許不熟悉 Fortran io, 那麼換用 C 語言的 io 吧

另外你也許需要到

http://science.openfoundry.org/ade/scilab/

http://groups.google.com/group/ade-scilab/web/scilab-2

看一下基礎 Scilab 教材.

> >
>

weianqq

unread,
Nov 15, 2009, 2:37:55 AM11/15/09
to 中文 Scilab 教育論壇
我先建立一個檔案再將他關閉

-->fid=file('open','123.txt','new')
fid =

1.

-->fid=file('open','123.txt','old')
fid =

2.

-->file('close',fid)


可是我再去目錄把這檔案刪除的話卻又顯示這檔案有其他程式在使用

我明明已經關閉啦?

寫入資料我照了步驟做
-->fid=file('open','123.txt','old')
fid =

3.

-->x
x =

0.2113249 0.3303271 0.8497452 0.0683740
0.7560439 0.6653811 0.6857310 0.5608486
0.0002211 0.6283918 0.8782165 0.6623569

-->write(fid,x)
!--error 49
檔案或格式錯誤.

之後那寫入矩陣也是..
-->fid=file('open','123.txt','old')
fid =

4.

-->write(fid,x,'(f10.2 f10.3 f10.4 f10.5)')
!--error 49
檔案或格式錯誤.

我現在比較了解fortran的格式碼了

X表空格,1X為空一格

I-->整數

F-->實數

E-->指數

D-->倍準度時數

G-->和E.F相同 用於不知實數大小時,由電腦判斷再轉換成E OR F

它們的型態都是 r格式碼w.d r:重覆列印次數 w:用幾個格子做列印 d:印到小數第幾位(我記得會四捨五入)

這樣講應該沒錯吧

我還有一個疑問

難道我沒辦法對同一個檔案連續寫入多筆資料嗎?

就是寫一次後再寫一次 這樣好像都被拒絕存取

Yung-Jang Lee

unread,
Nov 15, 2009, 6:03:14 AM11/15/09
to ade-scilab, weianqq
將十進位整數轉成 16,8,2 進位字串指令如下 :

bin2dec, oct2dec, hex2dec, dec2bin, dec2hex

這樣應該就可解決你的問題.


2009/11/15 Yung-Jang Lee <yjle...@gmail.com>:
> Scilab 內部 Fortran  格式的輸出, 沒有 16.8.2 進位輸出,
>
> 但 C 語言格式, 依照  printf_conversion 的說明, 可以有 16 (X,x), 8 (o)  進位輸出
> 但我試驗後發現只有  16 (X,x)進位可用
> 如
>
> -->printf('%d %x %X',123,123,123);
> 123 7b 7B
>
>
> 因此你如果要輸出成 6.8.2 進位可能要先自行轉成對應的字串, 再用字串格式輸出
>
> 2009/11/15 weianqq <wei...@yahoo.com.tw>:
>>
>>
>> 我要怎麼把變數的輸出格式變成16.8.2進位並控制它的有效位數?
>

Reply all
Reply to author
Forward
0 new messages