• ベストアンサー

CUI環境でのCプログラム ランダムアクセスが分からない

CUI環境でのCプログラムを作っています。 data.txtファイルの末尾に文字を追加させるプログラムを作っています。 ---data.txtの中身------- あああ いいいいい うううううううう ええ ------------------------ このdataファイルの末尾にコマンドプロンプトから文字を追加させるには、ランダムアクセスを使えばいいと思うんですが、どのようなプログラムにすれば良いのか分かりません。ランダムアクセスはバイナリファイルでしか使えないのでしょうか?

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★追加書き込みモード『a』でオープンすれば良い。 ・ファイルの末尾に文字列を追加したいだけならば、ランダムアクセスする必要は全く  ありません。fopen 関数で『w』ではなく『a』でオープンします。 ・あとランダムアクセスはテキストファイルでもバイナリファイルでも両方可能ですよ。 サンプル: FILE *fp; if ( (fp = fopen(filename,"a")) != NULL ){  fputs( "コマンドらいから取得した文字列", fp );  fputs( "\n", fp );  fclose( fp ); } 解説: ・普通、書き込みは『w』モードですが、追加書き込みを行いたい場合は『a』モードでオープンします。  あとは追加したい文字列を出力して『\n』も書き込んでおきましょう。→多分、行単位でファイル末尾に  追加したいのでしょうから『\n』を出力します。fgetc 関数でも出力できます。 ・なお、ランダムアクセスで操作を行いたい場合は『a+』モードでオープンしてから、ファイルの末尾に  fseek 関数などで移動してから文字列を追加すれば出来ます。 ・以上。参考に!→下の『参考URL』をどうぞ。

参考URL:
http://www9.plala.or.jp/sgwr-t/c/sec17.html
ikepan
質問者

お礼

ご返答ありがとうございます。 fopen関数を「a」でオープンするとdata.txtの末尾に文字を追加することができました。そして詳しい説明までしてもらい、とても勉強になりました。どうもありがとうございました。

その他の回答 (1)

noname#26652
noname#26652
回答No.2

既存のファイルの末尾にデータを追加するのであれば、 ランダムアクセスではなく、fopen()の第2引数に "a"(追加書き込みモード)を指定するだけでよいのではないでしょうか。

ikepan
質問者

お礼

ご返答ありがとうございます。 オープンモード「a」の存在を知りませんでした。おかげでファイルの末尾に文字を追加できることができました。どうもありがとうございました。

関連するQ&A

  • CでのCUIプログラミング 指定したファイルを生成する

    Visual C++でのCUIプログラミングをしています。 コマンドラインで文字を入力してもらうとその名前のバイナリファイルが生成される様にしたいのですが、どのようにプログラムを作ればいいのでしょうか? 「aaaa」と入力すると「aaaa.bin」というバイナリファイルが生成されるというプログラムを考えています。バイナリファイル名を入力する際に拡張子の入力が必要であれば「aaaa.bin」と入力してもらう形になっても構いません。

  • ランダムアクセスができない

    C言語のランダムアクセス(fseek)で、 アクセス位置を「ファイル末尾」に設定したいのですが どうも自分で作成したソースは正常に動いてくれません。 (常にアクセス位置が先頭になってしまいます) 何かが間違ってるのは確かなのですが、 もし原因がお判りの方がいらっしゃいましたら アドバイスをお願いします。 動作としては、追記書き込みみたいな感じで どんどん同一ファイルに書きこんで行く感じです ―――――――――――――――――――――――――― #include <stdio.h> #include <string.h> // 書き込み関数 bool Write( char *fname, char *str ){ FILE *fp = NULL; int len = (int)strlen(str); fp = fopen( fname, "wb" ); if( !fp ) return false; fseek( fp, 0L, SEEK_END ); printf( "位置:%d\n", ftell(fp) ); fwrite( &str, len, 1, fp ); fclose( fp ); return true; } // メイン関数 int main(){ char *fname = "Test.txt"; Write( fname, "テスト" ); Write( fname, "教えて" ); Write( fname, "goo" ); return 0; } ―――――――――――――――――――――――――― 動作結果:   Test.txtの中身「goo」 動作してほしい結果:   Test.txtの中身「テスト教えてgoo」 (※中身はバイナリ形式です)

  • CUI環境でコマンドにスペースを含むホルダー名を渡すには?

    ウインドウズXPsp4で 仮想ボストスクリプトプリンターの構築に 勤しんでるのですが そのなかで CUI環境でスペースを含むホルダー名を コマンドに渡すといった状態に似たことを 実現させる必要が出てきました 試しにDOSプロンプトで cd program files と、入れてみたところ やはり駄目でした 同様に cd progra~1 も試しましたが駄目でした cd "program files" も同様でした どうすればスペースを含むホルダー名を コマンドに引数として 上手く渡せますか?

  • C言語、リダイレクト

    C言語の初心者です。 コマンドプロンプトで「./a.out <text.txt」とうつと、text.txtのデータを取得し、表示するプログラムをつくろうと思っています。 試行錯誤の結果 #include <stdio.h> main(){ char abc; scanf("%s",&abc); printf("%c",abc); } だとエラーもなくコンパイルできるのですが、肝心のファイルの中身が一文字までしか表示されません。 これはchar abcでabcを一文字だけの変数にしているからみたいですが、調べてみたのですがどうもここから先に進めません。 どこをどのように変えれば良いですか?お願いします。

  • CUIって?

    パソコンの画面に命令やデータを表す文字列をキーボードから入力する操作環境をCUIって言うとありました。 MS-DOSとかUNIXがこれにあたるのだそうですが、言っていることはすごく理解できるのですけど、正式名はなんと言うのでしょうか? GUIはグラフィカルユーザーインターフェイスだから、コマンドユーザーインターフェースなのかな? それと、Excelなどのデータベース関数の引数にCriteriaとありますよね。 これってなんて読むのですか? PCの用語は難しいです。 教えてください。お願いします。

  • ファイルの先頭に文字を追加するには?

    ファイルの先頭に文字を追加するにはどうしたらよいでしょうか? ファイルの末尾に追加するなら echo 追加する文字列 >> ファイル名 でオッケーですが、 先頭に追加する方法が、単純そうなのに、調べても分かりませんでした。 例えば test.txt の中身が以下で、 aaa bbb # echo hello >> test.txt で aaa bbb hello となりますが、 hello aaa bbb とするには、どうしたらよいでしょうか。 単純なコマンドはあるでしょうか。

  • CUIとGUIでの言語の使い分け

    よろしくお願い致します。 Solaris10 で、 GUIは日本語環境で行い、CUIは文字化けするので 英語環境でのような使い分けって出来るのでしょうか。 その場合の設定はどこなのでしょうか・・。 (GUIの中のpromptは日本語文字化けしてないのですが、 CUIだと、文字化けするので英語バージョンに戻したいです) また、コマンドライン の /.PRFILEを書き換えれば#の前部分を かえれるようですが、このファイルはいずこ?状態です。 よろしくお願い致します。

  • C++でコマンドプロンプトに図形を描くプログラム

    コマンドプロンプトで長方形を描くプログラムがわかりません。 長方形の4点(x1,y1),(x2,y2),(x3,y3),(x4,y4)の座標を保存してから、長方形の外周と中身を それぞれ適当な文字で埋めて長方形の絵を作るプログラムなのですが、 どうすれば指定した座標に好きな文字をコマンドプロンプトで表示できるのでしょうか? 私の知識ではprintfを使ってスペースで間隔あけて表示することくらいしか分からなくて困っています。

  • VBScript(WSH)でのランダムアクセス

    VBScript(WSH)を用いてファイル内を検索し、特定文字列の次の行に文字列を追加するスクリプトを作成しています。 シーケンシャル方式を用いた方法では作ることが出来ました。 ただ、それだと一度全ての行をを読み込み特定位置に追加した後、もう一度全て上書きしているため処理が多くなってしまいます。 そこでランダムアクセスを用いて任意の位置に文字列を挿入できないかと考えました。 VBの Open ファイルパス For Random As ~ も試しましたがうまく動きませんでした。(構文として認識していない?) VBSでのランダムアクセスは不可能なのでしょうか? 良い方法がございましたらご教授ください。 よろしくお願いします。

  • FedoraCore4 CUI表示

    こんばんは。いつも勉強させて頂いております。 FedoraCore4をインストールしました。テキストエディタで テストファイルを作成し、/etcフォルダ直下に保存しました。 これをCUIからlsコマンドで見ると文字化け表示されます。 ファイル名を平仮名から英字に変更すると文字化けしません。 また、catコマンドで中身を閲覧すると同様に文字化けします。 ただし、中身を英字に変えると文字化けしません。 以上の事からCUIでは日本語表示不可なのでしょうか? それとも何かユーティリティ等の設定で表示可能なのでしょうか? また、CDコマンドでの移動についてなのですが、ルート直下にあるetcや homeには移動できるのですが、etc直下のディレクトリや、 home直下のディレクトリに移動できません。homeの直下にFedoraという 初期ユーザー名のディレクトリがあり、その中に保存してあるファイルを 表示するにはどうすればよいのでしょうか?cd /home/Feforaで、ディレクトリの移動をしてもhomeに移動するだけです。何故なのでしょうか? 大変初歩的な質問で恐縮ですが、ご教授頂けますようお願い致します。

専門家に質問してみよう