テキストファイルを開く方法と作成方法

このQ&Aのポイント
  • C言語を勉強し始めて4ヶ月の私が、テキストファイルを開く方法と作成方法について質問です。
  • system( )以外の方法でテキストファイルを画面上に開く方法を知りたいです。
  • また、テキストファイルを名前.txtで作成し、作成直後に開く方法についても教えていただきたいです。
回答を見る
  • ベストアンサー

テキストファイルを開きたいです。

まだC言語を勉強し始めて4ヶ月です。宜しくお願い致します。 cygwinをWindowsに入れて作成しています。 テキストファイルを画面上に開きたいのですが、system( )以外にありますでしょうか? system("notepad c:/test/test.txt"); (¥では上手くいかず、↑なら開けました) しかし、上記だと特定の1つのファイルしか開けないので、困っています。 例えば、名前、年齢を入力させて、テキストファイルを名前.txtで作成し、 作成直後に確認のため、名前.txtを開くといった事をしたいです。 namefile[128]といった文字列に"notepad c:/test/test.txt"を入れて、 system(namefile)としたところ、 シェルで認識できませんといった内容が表示されてできませんでした。 (やり方が悪いとは思いますが・・) これができれば、名前をからめてアドレスを文字列にできるかなと・・(泣)。 何か案があれば教えて下さい。 環境:WindowsXP     cygwinにてコンパイル(gcc)     sakuraエディタにて作成

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

> //ファイルを開く > sprintf(cmd_fileopen,"\"notepad %s\"",cmd_idname); > system(cmd_fileopen); ああ、うまくいかないのは \" を使ってるからですね。 こうすると system に渡る文字列自体に"がついて "notepad c:/doc/hoge.txt" のようになりますが、そうするとこの文字列全体をコマンド名と解釈するはずです。 ですので、 sprintf(cmd_fileopen,"notepad %s", cmd_idname); のようにしてやれば起動できるようになると思います。 >>snprintf(cmdbuf, sizeof cmdbuf, "notepad %s", cmd); >snprintf()って関数でしょうか? はい。sprintfでの出力先のバッファサイズを指定できるようなものです。 昨今はバッファオーバランやらなんらやにやかましいので この手の関数を使うほうが多いもので。 Manpage of PRINTF http://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html ↑にsnprintfの説明もあります。 > cmdbufはchar cmdbuf[128]とか適当でいいですか? >(文字列+1)の数の宣言にした方がいいのでしょうか? これはsnprintfの場合の話ですか? であれば、 > snprintf() と vsnprintf() は、 size バイトを越える文字数を書き込まない (size には文字列を終端する aq\0aq もを含まれる)。 ですので、何も考えずにバッファの大きさを渡せばいいです。 > cygwinを入れているからややこしいのでしょうか? > sh (エラー内容) がコンパイルするとでるので、アドレスの指定が > ¥ ではなく / でないといけないとUNIXは分からないのかなとか、 > いろいろ考えている間に、ごちゃごちゃになってしまいました(泣)。 Windows形式のパス区切りとUNIX形式の区切りを混ぜると混乱しやすいので 統一したほうがいいでしょうね。 ドライブが絡まなければUNIX形式でいいと思います。 cygwinはまあ、事情をわかった人が使うものだと思うので、何かを覚えるために使うというのは ちとつらいような気もします。 #いろいろ「クセ」がありますから

akimasabon
質問者

お礼

ありがとう御座いました。 sprintfでうまく開く事ができました。 ただ、snprintf() はVC2008で確認した所、エラーで返ってきました(泣)。 使える関数だなと思ったのに・・。

その他の回答 (3)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

Visual Studio 2008 であれば、ちょっと違う名前で同じ機能の 関数を持っていますから、それを使ってみてはどうでしょう。 _snprintf_s、_snprintf_s_l、_snwprintf_s、_snwprintf_s_l (CRT) http://msdn.microsoft.com/ja-jp/library/f30dzcf6(VS.80).aspx この他にも、同様にしてバッファのサイズも引数に取るようにして チェックを強化した関数がいろいろありますから興味と時間があれば 見てみると良いかもしれません。 CRT 関数のセキュリティが強化されたバージョン (CRT) http://msdn.microsoft.com/ja-jp/library/wd3wzwts(VS.80).aspx が、今度は逆に他のコンパイラを使うときに苦労したりする可能性があるので 注意してください。

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

>テキストファイルを画面上に開きたい・・  ファイルオープン、fopen() と  (ファイル終了まで)  1行ずつ読み込み、fgets() と  1行ずつ画面出力、printf() でよいのではと・・(◆)。  (ファイル終了 fclose() )  http://www.bohyoh.com/CandCPP/C/Library/index.html >system()以外にありますでしょうか?  質問主旨は、件名の「テキストファイルを開きたいです。」ではなく、Cプログラムからの「アプリケーションの起動方法」でしょうか?。 ただ単に、 >作成直後に確認のため、名前.txt を開くといった事をしたいです。 のであれば、C言語にこだわらず、  コマンドラインから、   >cd c:\kadai_k   >attrib +R 名前.txt   >type 名前.txt  が簡単かと。 >特定の1つのファイルしか開けないので、困っています。  テキストファイルがたくさんあるのなら、バッチファイルにするとか・・。 ------------------------------------ C言語にこだわるのならば、少なくとも、notepad の部分は、冒頭(◆)の方法にした方がよろしいのでは。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

やり方はいろいろありますが、 cmd = "c:/test/test.txt"; snprintf(cmdbuf, sizeof cmdbuf, "notepad %s", cmd); system(cmdbuf); みたいにsystemに渡す文字列を組み立てるとか。 > namefile[128]といった文字列に"notepad c:/test/test.txt"を入れて、 > system(namefile)としたところ、 > シェルで認識できませんといった内容が表示されてできませんでした。 具体的にはどんなコードを書いたのですか? > system("notepad c:/test/test.txt"); > (¥では上手くいかず、↑なら開けました) \\ と書けばうまくいくでしょう。

akimasabon
質問者

補足

回答有難う御座います。 char id[4]; cahr cmd[128]; char cmd_idname[128]; char cmd_yomi[128]; char cmd_fileopen[128]; id="1"; sprintf(cmd_idname,"%03s.txt",id); //ディレクトリ移動 system("cd c:/kadai_k/"); //ファイルの属性を読み取り専用へ変更 sprintf(cmd_yomi,"\"attrib +r %s\"",cmd_idname); system(cmd_yomi); //ファイルを開く sprintf(cmd_fileopen,"\"notepad %s\"",cmd_idname); system(cmd_fileopen); といったような感じです。 >snprintf(cmdbuf, sizeof cmdbuf, "notepad %s", cmd); snprintf()って関数でしょうか? sprintf()ならsizeof cmdbufって間に入れるんですね~。 知らなかったです(汗)。 cmdbufはchar cmdbuf[128]とか適当でいいですか? (文字列+1)の数の宣言にした方がいいのでしょうか? cygwinを入れているからややこしいのでしょうか? sh (エラー内容) がコンパイルするとでるので、アドレスの指定が ¥ ではなく / でないといけないとUNIXは分からないのかなとか、 いろいろ考えている間に、ごちゃごちゃになってしまいました(泣)。

関連するQ&A

  • C#のテキストファイル読み込みについて

    C#のテキストファイル読み込みについて 2次元配列を使います(a[行][列]みたいに テキストファイルを1文字ずつ読み込みます。 そして、改行文字が見つかると行を1つずらします それを繰り返して最後まで読みこむと終わり そんなことをしたいです DOBON.NETでこんなの見つけたんですが 上の処理をしようと思っても、どこをいじればできるのかわかりませんでした //"C:\test.txt"をShift-JISコードとして開く System.IO.StreamReader sr = new System.IO.StreamReader( @"C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); //内容を一行ずつ読み込む while (sr.Peek() > -1) { Console.WriteLine(sr.ReadLine()); } //閉じる sr.Close(); よくわかるサイトとかあったら教えてください、お願いします

  • VB.NET テキストファイルにデータを書き込み

    テキストファイル("c:\test.txt")に「かきくけこ」と全角5文字で1行のデータがあるとします。 このテキストファイルに「あいうえお」を先頭に追加で書き込みたいのですが、どうすればいいのでしょうか? あくまで「かきくけこ」を変数化せずファイルに直接、書き込む方法がある場合、教えてください。 'テキストファイルを開いたときの内容 あいうえお かきくけこ ちなみにですが、テキストファイル("c:\test.txt")に「かきくけこ」と全角5文字で1行のデータがあるとして、 末尾に「さしすせそ」を追加で書込みする方法は下記の通りでした。 'ファイルを書き込み用に開く、指定したファイルがない場合は作成する dim fsFile As System.IO.FileStream = _ System.IO.File.OpenWrite("c:\test.txt") 'StreamWriterオブジェクトを作成し、テキストデータが書き込めるようにする Dim sw As System.IO.StreamWriter = _ New System.IO.StreamWriter(fsFile) 'ファイルの末尾に移動する sw.BaseStream.Seek(0, System.IO.SeekOrigin.End) 'データを書き込む sw.WriteLine("さしすせそ") 'ファイルを更新する sw.Flush() 'ファイルを閉じる sw.Close() fsFile.Close() 'テキストファイルを開いたときの内容 かきくけこ さしすせそ

  • ファイル操作について、テキストファイルの書き換え

    よろしくお願いします。 データファイルAからデータを取得して、テキストファイルBの内容の一部を取得したデータで書き換えるという操作を行うプログラムを作りたいです。 具体的には、 データファイルA[A.txt]の中身 111 222 333 444 テキストファイルB[B.txt] 文字列1="123" 文字列2="234" 文字列3="345" 文字列4="456" というような二つのファイルを読み込み、B.txtの""で囲まれた部分を、A.txtで取得したデータで置き換えるような操作を行いたいのですが・・。 使用する言語としてはスクリプト言語であるperl、もしくはプログラム作成経験があるCを使用しようと思っています。(perlは未経験で入門書を読んでいるレベル)

    • ベストアンサー
    • Perl
  • バッチファイルでテキストファイルの文字列を取得したい

    すみません、どなたか教えて下さい。 バッチファイル(test.bat)内で、他のテキストファイル(ok.txt)の文字列を取得したいです。 ok.txtは 20070614 TEST となってます。 この2つの文字列をそれぞれで取得する方法を教えて下さい。 よろしくお願い致します。

  • アクセス VBA ファイル操作

    ノートパッドなどテキストエディタで開くことができる、拡張子がtxtではないファイルがあります。 そのファイルをテキストエディタで開いて、名前を変えて、テキストファイルとして保存したいのです が、どのようなコードになりますでしょうか? 下記で開くのですが、 Shell "NOTEPAD C:\test\sampl\abc.ini" その後、 SaveAs FileName:="C:\test\temp\xyz.txt", のように処理しようと思ったのですが、上手くいきません。 お手数ですがご教示ください。

  • CSVファイルの情報をテキストファイルに吐き出したいのです。

    CSVファイルの情報をテキストファイルに吐き出したいのです。 VB、もしくはエクセル付随のVBで作成したいです。 その際、雛形テキストファイルの任意の文字列をcsvファイルの特定セルの文字列に置換して吐き出したいのです。 例えば、雛形テキストファイル(hinagata.txt)の内容として、「[アーティスト]名の[曲名]は良い曲ですね。」という雛形文章があったとしたら、「安室奈美恵の愛してマスカットは良い曲ですね。」のように置換して吐き出す。 吐き出す際、任意の名前でディレクトリーも作成し、そのディレクトリー内にkyokumei.txtというファイル名で吐き出したいです。 以下の表で言えば、amuronamieというディレクトリーにkyokumei.txtを吐き出し、 その次は、komurotetsuyaというディレクトリーにkyokumei.txtを吐き出します。    A             B            C         1 アーティスト名   artistname         曲名       2 安室奈美恵    amuronamie     愛してマスカット 3 小室哲哉      komurotetsuya      get wild プログラミングの知識はほとんどありませんので、どこに何を書くと具体的にお願いできたらと思います。よろしくお願いします。    

  • テキストファイルの任意の文字以降の文字列を削除したい

    test.txt AAA+あいうえお BBB+かきくけこ CCC+さしすせそ DDD+たちつてと EEE+なにぬねの 上記(test.txt)のようなテキストファイルから、各行の+以降の文字列を削除して、 以下(result.txt)のようなテキストファイルを生成させるプログラムを作成させたいです。 result.txt AAA BBB CCC DDD EEE このようなプログラムを作るにはどのようにすればよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 100文字が並ぶテキストを10行10列にする方法(Bシェルにて)

    100文字が並ぶテキストをBシェルにて10行10列にする方法を教えてください。 テキスト(test.txt)には、次のようにスペースで区切られて100文字入っています。(この例の様に規則性はありません) 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 ..(省略) ↓これを 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 (省略) の様にするやり方を教えてください。 Bシェル初心者です。宜しくお願い致します。

  • テキストファイルの一部置換したファイルをたくさん作りたい

    テキストファイル(a.txt)があるのですが このファイルの一部の文字列aaaをbbbに置換したファイル(b.txt)を作りたいです。 また文字列aaaをcccに置換したファイル(c.txt)も作りたいです。 続けてd.txtやe.txt・・・と作っていきたいですが簡単にできるフリーソフトはないでしょうか? 現状はa.txtを開いてaaaをbbbに置換して、別名で保存するのを繰り返し(10回以上)するので大変です。 このようなことが楽にできるフリーソフトがあれば教えてください。

  • C#にてテキストファイル読み込み時のファイル指定

    C#でテキストファイルの読み込みがうまくいかず困っています。 他のPCの共有フォルダにアクセスしたいのですが //読み込むテキストファイル string textFile = @"192.168.0.**\test\a1.txt"; //文字コード(ここでは、Shift JIS) System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis"); //テキストファイルの中身をすべて読み込む string str = System.IO.File.ReadAllText(textFile, enc); ネットで検索した文に従ってやっていますが、 System.IO.DirectoryNotFoundException: 'パス 'C:\Users\***\source\repos\WindowsFormsApp1\WindowsFormsApp1\bin\Debug\192.168.0.**\test\a1.txt' の一部が見つかりませんでした。 と、ファイルがあるディレクトリが追加されています。 どこを設定すれば無視できるようになりますか? Visual Studio2017を使用しています。 会社のPCでは問題なく指定できたのですが 自分のPCだと上記のようになります。 ネットで文を検索しながら作っている素人です。 お手柔らかにお願い致します。