ファイル型の操作がうまくいかない(pascal)

このQ&Aのポイント
  • 名前と電話番号を入力するとそれらのデータを外部環境のファイル'teldata'に出力し、内容を全て表示させるプログラムを作成しています。
  • 'teldata'はレコード型を成分とするファイルで、入力可能な人数は特に定めません。
  • しかし、ファイルへの書き込みや読み込み時にタイプの不一致エラーが発生してしまいます。どのように修正すれば良いか教えてください。
回答を見る
  • ベストアンサー

ファイル型の操作がうまくいきません(pascal)

名前と電話番号を入力するとそれらのデータを外部環境のファイル'teldata'に出力し、内容を全て表示させるプログラムを作っています。 入力可能な人数は特に定めない・'teldata'はレコード型を成分とするファイル、という条件の下作成したのですがどうしてもエラーが出てしまいます。 どう改善すればいいのかご教授ください。 ソース) program kadai(input,output,meibo);     {line 3} type KojinData = record name : packed array[1..20] of char; tel : packed array[1..15] of char end; var meibo : file of KojinData; x : array[1..100] of KojinData; name : packed array[1..20] of char; tel : packed array[1..15] of char; i : integer; begin rewrite( meibo,'teldata' ); i :=0; write('名前:'); readln( name ); repeat i := i+1; x[i].name := name; write( meibo,x[i].name ); {line 23} write('電話番号'); readln( tel ); x[i].tel := tel; write( meibo,x[i].tel );         {line 27} write('名前:'); readln( name ) until (name='end'); reset( meibo,'teldata' ); while not eof( meibo ) do begin for i := 1 to 100 do begin read( meibo,x[i].name,x[i].tel );    {line 34} writeln( x[i].name,x[i].tel ) end end end. エラーメッセージ) E 25190 line 23 - Type clash: string is incompatible with record ... 25430: Type mismatch in write to non-text file E 25190 line 27 - Type clash: string is incompatible with record ... 25430: Type mismatch in write to non-text file E 25190 line 34 - Type clash: record is incompatible with string E 25420 line 34 - Type mismatch in read from non-text file E 25190 line 34 - Type clash: record is incompatible with string E 25420 line 34 - Type mismatch in read from non-text file 次の課題の「検索したい人の名前を打ち込み対応する電話番号を答える」ようにもしたいので配列xを作り最大100人としています(人数を定めないように組めなかったのでとりあえず)。

  • rurur
  • お礼率50% (24/48)

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

試さないで書いてますが、23行と27行は、 write( meibo, x ); ――では。お使いの処理系のマニュアルを確認してみては。 試さないと思ったけど、一応実験コード: program kadai; type KojinData = record name:string; tel: string; end; var x, y: KojinData; f: file of KojinData; begin assign( f, 'f.dat' ); rewrite( f ); x.name := 'de pascal'; x.tel := '0120-999-999'; write( f, x ); close( f ); reset( f ); read( f,y ); writeln( 'name:', y.name, ', tel:', y.tel ); end. (* Turbo Pascal 5.5で試してます。使うの久し振りだ。 *)

rurur
質問者

お礼

ありがとうございます、助かりました。 変に難しく考えすぎてました。

関連するQ&A

  • 検索がうまくいきません(pascal)

    名前と電話番号を外部環境'teldata'に出力し、検索したい人の名前を入力し対応する電話番号を答えるプログラムを作りました(登録されてなければ「該当者なし」と出力、'end'が入力されるまで続く)。 コンパイルは通ったのですが検索結果はおかしなものになってしまいました。 どこが間違っているのか、ご教授ください。 ソース) program kadai(input,output,meibo); type KojinData = record name : packed array[1..20] of char; tel : packed array[1..15] of char end; var meibo : file of KojinData; x : KojinData; begin rewrite( meibo,'teldata' ); write('名前:'); readln(x.name); repeat write('電話番号:'); readln( x.tel ); write( meibo,x); write('名前:'); readln( x.name ) until (x.name='end'); reset( meibo,'teldata' ); write('名前:'); readln(x.name); repeat while not eof( meibo ) do begin read( meibo,x ) end; if x.name = x.name then begin writeln('電話番号:',x.tel) end else begin writeln('該当者なし') end until (x.name='end') end. 結果) 名前:a 電話番号:1 名前:b 電話番号:2 名前:c 電話番号:3 名前:end 名前:a 電話番号:3 電話番号:3 電話番号:3 電話番号:3 {強制終了するまで続く}

  • 配列操作

    SQLで取得した配列データを新たな配列に作り直したいのですがやり方がわかりません。おしえてください。 取得される配列例です。 $Array[i][日付][タイプ][個数][タイプ別レコード数] ↓ $Array[0][0901][1][3][2] $Array[1][0901][2][4][2] $Array[2][0901][3][5][2] $Array[3][0902][1][5][2] $Array[4][0902][2][10][2] $Array[5][0902][3][7][2] この配列を日付が同じものだけ1レコードに作りなおしたいのですがどのようにすればいいでしょうか。 期待する配列例 $Table[i][日付][タイプ1個数][タイプ2個数][タイプ3個数][レコード数] ↓ $Table[0][0901][3][4][5][6] $Table[1][0902][5][10][7][6] よろしくお願いします。

    • 締切済み
    • PHP
  • foreachで多次元配列を生成

    こんにちわ。 配列をforeachでループさせて、それを多次元配列に入れていくことは可能でしょ うか? 例えば以下のようなデータがあるとします。 ---meibo.dat-------- c21<>田中<>21<>東京 c22<>佐藤<>22<>大阪 -------------------- ---test.php----------------------------------------------------- <? $list_meibo = file("meibo.dat"); foreach($list_meibo as $temp){    $i=split("<>",$temp);    $a=array($i[0] => array("name"=>$i[1],"age"=>$i[2],"ad"=>$i[3]),); } ?> ------------------------------------------------------------------- これでは $a=array("c21"=>array("name"=>"田中","age"=>"21","ad"=>"東京"), "c22"=>array("name"=>"佐藤",age"=>"21","ad"=>"大阪"),); という具合になってくれないでしょうか? これでいくと、配列の最後の要素のみデータに残ります。 どのようにしたらよいでしょうか? ご教授お願いします。

    • ベストアンサー
    • PHP
  • 整順リスト形式の英単語辞書(pascal)

    キーボードから「英文」を読み込み、空白(スペース)を英単語の区切りとみなして英単語辞書を整順リスト形式で作りたいのですがうまくいきません。 ソースとコンパイル結果の間違いは↓にありますが、そもそも v := read( sentences ) なんてのが可能なのかもわかりません。(readは最初から一文字ずつ読むとか聞いたのでこうしたのですが・・・) どなたかご教授ください。 program kadai(input,output); type list = ^mojirec; mojirec = record newword : packed array[1..20] of char; next : list end; var sentences,v : packed array[1..500] of char; p,head : list; procedure insert(var p : list; x : packed array[1..20] of char ); var q : list; begin if p = nil then begin new(p); p^.newword := x; p^.next := nil end else if x < p^.newword then begin q := p; new( p ); p^.newword := x; p^.next := q end else insert( p^.next,x ) end; procedure print( p : list ); begin if p<> nil then begin writeln( p^.newword ); print( p^.next ) end end; begin head := nil; write('英文:'); readln( sentences ); repeat repeat repeat read( sentences ); v := read( sentences ); until( read('') ); insert( head,v ) until ( read('.') ); writeln('英文:'); until ( sentences = '.' ); print( head ) end. In program kadai: E 18240 x undefined on lines 16 19 22 26 E 18240 insert undefined on line 26 終了条件はピリオド単体を読み込んだとき、英文の最後はピリオドを付けるようにとなっています。

  • Pascal言語で小町算

    Pascal言語で、『1~9の順に数字を並べ、+、-を補い式を作り、 値が100になる組み合わせをすべて出力するプログラムを作成せよ(例:12 - 3 - 4 + 5 - 6 + 7 + 89 = 100)。』 という課題が出ました。自分なりに組んでみたのですが、 12個あると聞いたのに、4個しか出力されません><; どこが間違っているのかご教授いただけると幸いですっ ------------------------------------------------------- program KomachiZan(output); var i,s:integer; var sign:array[1..9] of integer; var x,n:longint; begin writeln('< 小町算 -Komachi Zan- >'); for i:=1 to 9 do sign[i]:=-1; repeat x:=0; n:=0; s:=1; for i:=1 to 9 do begin if sign[i]=0 then n:=10*n+1 else begin x:=x+s*n; s:=sign[i]; n:=i; end; end; x:=x+s*n; if x=100 then begin for i:=1 to 9 do begin if sign[i]=1 then write(' + ') else if sign[i]=-1 then write(' - '); write(i); end; writeln(' = 100'); end; i:=9; s:=sign[i]+1; while s>1 do begin sign[i]:=-1; i:=i-1; s:=sign[i]+1; end; sign[i]:=s; until sign[1]>=1; end. -------------------------------------------------------

  • 複数テーブルからのデータ取得方法

    SQL初心者ですが、教えてください。 (oracle10g を使用します) 下記の様なテーブルがあります。 テーブル名  カラム名 MEIBO    NAME, TYPE, HOME_CODE, OFFICE_CODE HOME     HOME_CODE, HOME_ADR, HOME_TEL OFFICE    OFFICE_CODE, OFFICE_ADR, OFFICE_TEL MEIBOテーブルのTYPEが1の場合、HOME_CODEをキーとして、HOMEテーブルより HOME_ADRとHOME_TELを取得、 MEIBOテーブルのTYPEが2の場合、OFFICE_CODEをキーとして、OFFICEテーブルよりOFFICE_CODE,OFFICE_ADR,OFFICE_TELを取得し、 下記のイメージのように出力をしたいです。 NAME TYPE   ADR    TEL -------------------------------------- 山田  1    東京都… 03-XXXX-XXXX 鈴木  2    神奈川県 045-XXX-XXXX 以上です。 ご存知の方いらっしゃいましたら よろしくお願い致します。

  • パスカル→JAVA

    下記のパスカルからJAVAに変えるのですが、わからなくてこまってます。よろしくおねがいします。 { 宣言部 } type ZISU= array[0..99] of real; var n,k :integer; p,VALREAL,VALIMAG: ZISU; { EXTERNAL procedure EVAL ( p:ZISU; n:integer; var VALREAL,VALIMAG:ZISU ); } {$I B:EVAL.SRC} { メ イ ン プ ロ グ ラ ム } begin write(lst,'Input vector'); writeln(lst); read(n); readln; write(lst,' n=',n); writeln(lst); for k:=0 to n-1 do begin read(p[k]); readln; write(lst,p[k]); writeln(lst) end; EVAL(p,n,VALREAL,VALIMAG); writeln(lst); writeln(ist); write(lst,'Output vector [THE DISCRETE FOURIER TRANSFORM]'); writeln(lst); for k:=0 to n-1 do begin write(lst,' ',VALREAL[k],'+(',VALIMAG[k],'*i)'); writeln(lst) end end. 

  • 多次元配列から作った表の重複行をまとめたい

    データベースからある期限(14年3月21日から3月30日)で取得した下記の多次元配列から日付に該当するデータがあればセルに値を入れて表を作ったのですが、 <?php $cal=array( array("type" => 19, "name" => "山田", "hour" => 5, "day" => 2014-03-21), array("type" => 19, "name" => "山田", "hour" => 8, "day" => 2014-03-24), array("type" => 19, "name" => "山田", "hour" => 8, "day" => 2014-03-26), array("type" => 19, "name" => "田中", "hour" => 8, "day" => 2014-03-23), array("type" => 19, "name" => "田中", "hour" => 8, "day" => 2014-03-26), array("type" => 19, "name" => "田中", "hour" => 3, "day" => 2014-03-28), array("type" => 20, "name" => "大田", "hour" => 3, "day" => 2014-03-21), array("type" => 20, "name" => "大田", "hour" => 5, "day" => 2014-03-27), array("type" => 20, "name" => "田中", "hour" => 3, "day" => 2014-03-24), array("type" => 20, "name" => "田中", "hour" => 4, "day" => 2014-03-27), array("type" => 0, "name" => "高橋", "hour" => 1, "day" => 2014-03-27), ); ?> <?php foreach ( $cal as $val ) : ?> <tr> <td><?php echo $val['type']; ?></td> <td><?php echo $val['name']; ?></td> <?php for ( $i = 21; $i <= 30; $i ++ ) : ?> <td> <?php if ( $day == $i ) { echo $val['hour']; } ?> </td> <?php endfor; ?> </tr> <?php endforeach; ?> 同じIDと名前の行が複数あり、同じIDと名前の行をひとつにしたいのです(画像参照)がわからず質問させていただきました。よろしくお願い致します。

    • ベストアンサー
    • PHP
  • データを一括で処理する方法について

    環境はMysql4.1,PHP5です。 テーブルに ID name tel ------------------ 1 aaa 03-3333-3333 2 bbb 022-222-2222 3 ccc 0120-00-0000        があります。 これをWeb上に表示させ <form action=exe.php method=post> while ($col = mysql_fetch_array($rst)) { print"名前<INPUT size='30' type='text' name='name' value='$col[name]'> TEL<INPUT size='12' type='text' name='tel' value='$col[tel]'> 更新<input type=radio name=$col[id] value=0> 削除<input type=radio name=$col[id] value=1>"; } <INPUT type=submit value=実行></form> と3件表示させた後、3件一括で更新・削除の 処理をしたいと思っています。3件は固定ではないです。 1件ずつの更新・削除はできました。 ラジオボタンのnameをIDにしてレコードごとに 更新・削除を区別すればいいのかと思いましたが、 やり方がわからず行き詰っています。。 ご教授よろしくお願いします。

    • ベストアンサー
    • MySQL
  • Pascalの可変レコードをC言語で表現したい。

    Pascalの可変レコード型のプログラムをC言語で表現したいのですが 調べた所、共用体(Union)を使えばよいと見つけました。 しかし、どのように対応すればいいのかよく理解ができず困っています。 以下のプログラムをC言語で表現すると、どのようになるのか ご教授していただけないでしょうか。よろしくお願いします。 type Person = record name,firstname: alfa; birthdate: Date; marstatus: (single,married,widowed,divorced); case sex: (male,female) of male: (weight: real;   bearded: Boolean); female: (size: array[1...3] of integer) end

専門家に質問してみよう