ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語とC++言語コミュのファイルの読み書き

  • mixiチェック
  • このエントリーをはてなブックマークに追加
実行例↓↓
[1]ファイルの読み込み
[2]ファイルの書き込み
番号を入力して下さい=>2
ファイル名を入力して下さい=>abc.txt
aaaaa
bbbbb
ccccc
CTRL+Z
書き込み終了

[1]ファイルの読み込み
[2]ファイルの書き込み
番号を入力して下さい=>1
ファイル名を入力して下さい=>abc.txt
aaaaa
bbbbb
ccccc
読み込み終了

こんな感じにしたいのですがやり方がさっぱり分りませんがまん顔
Microsoft Visual Studio 2005を使って作成しています。
C++で作っています。
分かる方教えてもらえると嬉しいですわーい(嬉しい顔)

コメント(38)

さっぱりわからないのは"何のやり方"ですか?
読むだけ/書くだけ ならできますか?
宿題/課題ですか? 先生/友達に訊きましたか?
わからないのは:

なにをすればいいか ですか?
どうすればいいか ですか?
どうコードに落とすか ですか?

実現のための手順を箇条書きにできますか?
コードに落とせるレベルまでブレークダウンできますか?

それとも、恥を忍んでそのものズバリのコードをくれ ですか?
>Microsoft Visual Studio 2005を使って作成しています。
どこまで作成したのか?




…それと、個人的には質問者が顔文字や絵文字を使っているのを見るとなんとも無礼なと思うのですが、皆さんはどうですか?
 Visual Studio でコンソールアプリを作る人は比較的少ない(ような気がする)ので、がんばっていただきたいものです。
プログラムの中身というか、

・どんなライブラリを使えばいいのかわからない
・実はどんな関数を使えばいいのかもわからない
・実は実はどんな手段があるのかもわからない
・実は実は実はWindowsで何ができるのかわからない

って所だろうか。

MSDNがMSDN2になって、初歩的な情報に関するリンクがローカルファイルのインデックスとWebサーバーの対応ががたがたになってしまったのでさぞ大変だろうと思います。

気晴らしにUNIX系(BSD,Linuxでもおーけい)で挑戦してみて、それからWindowsに手をつけたほうがいいかも知れないですね。
>>6
そうでもないです。
私は、C/C++ではコンソールアプリケーションばっかり作ってます。
#GUIアプリ書くときはVisual BASICを使ってます。


で、コンソールアプリ書くときはコマンドプロンプトから作るとラクチンです。ちゃんとVisual Studioをインストールするとコンパイル用のコマンドプロンプトのショートカットも作られます。
#コードは別のエディタで書きます。
> 顔文字や絵文字を使っているのを見るとなんとも無礼なと思うのですが、皆さんはどうですか?

僕はそんなに気にならない。
そんなことより"質問のプロ"であるはずの学生さんが
単に「分かりません」なんて具体性に欠ける質問
しかできないてのはどうよ? って思います。
クレクレ君は、仕事では結構、嫌がられる存在です。
ではなく、
「ここまでやったんだが、ここからどうしたらいいかわからない」
という質問だと、ヒント的なものを与えられるのではないでしょうか。

答えズバリ!より、なんで、こうなるのかという
アルゴリズム的なものを理解してもらう方が本人のためにも
なるのでは。。。

まず、ファイルI/O系の標準関数がわかってるかどうか…。
そこから回答してもらった方がいいと思います。
とりあえずは自分で調べてできるとこまで頑張ってみましょう!!
そうすればわからない部分も明確になってくるはずです。
もうひとつ,プログラムにやらせたいことを,1つの実行例を示すのではなく,ちゃんと文章で説明(定義)することですね.

プログラムにやらせたいことが明確医なれば,自ずと書き方も判ります.このレベルの練習課題なら.
いやー、その考えには賛同致しかねます。

プログラムにやらせたいこと、を明確に文章で定義 (要求仕様の明確化) をしたところで、書き方はさっぱり分からんと思うのですよ。
このレベルの練習課題で、「分かりません」 と質問してくるレベルなら。

たぶん、要求仕様を定義できたとしても、プログラムへの落とし込み方が分からない、となるに一票入れておきます。
# そう言う人たちを、腐るほど見てきましたので・・・
まず何から手をつけたら良いのかわからないかもしれないので、検索用キーワードを置いていきましょう。
- iostream
- cout
- cin
- fstream
- C++ AND (ファイル操作 OR ファイル処理)
- C++ AND (switch文 OR if文 OR 条件分岐)

検索した内容に対してある程度知識がないと検索結果を生かすのは難しいと思いますので、売れてそうなC++の本を買って、例文を自分で入力して感覚をつかむ方がよいかもしれませんが。
Farsseさんに同意

基礎を勉強せずに、これこれがしたいけど分からないという人が多すぎ。
C言語使えないのに、アルゴリズムについて質問してきたり。

基本をおさえないと、いつまでたっても組めないというのを理解してもらえないんですよね。
そうですね.
逆にアルゴリズムが判ってないのに「C言語の質問です!」って言う質問者も多い.
対象領域のの勉強をせずにCだけ学んでプログラムが書けませ〜ん.とかいうのもありがちですね.
うーん.必ずしもそうでもないです >14

実際に初心者に教えてみれば判ります.
やつら,「考えたけど判りません」と口では言いますが,実際には考えてないんですよ.答えが思い浮かばないと悩んで(頭が空回りして)るだけ.

なんか,作業を段階に分けてとか具体的には?とか,きっかけを与えると空回りが止ることもあり(もちろん,ダメなことも多々あり).

プログラムのすべき動きを,料理のレシピふうに,とか昔はやったゲームブック風に,とか書き下してみさせるのも1つの手.
あるいは「君が偽コンピュータの箱に入ってコンピュータのふりをしてその仕事を手作業で行うとして,どうする?」と考えさせてみるとか.
基本は、やりたいことを明確にし、どうやったら実現できるか考えることでしょ?
これがしっかりしていれば、言語なんて表現手段のひとつに過ぎないわけです。
基本がしっかりしていればCだろうがC++だろうが、JAVAだろうがコードは書けます。

仕事だと、教えて君よりも自分で調べる人のほうが使えないこともあります。
締め切り間際になって、「自分で調べたけどわかりませんでした」、なんて言われるとね。
>18
何度も初心者に教えていますので、おっしゃることはよく分かります。
たいていの場合は、

> あるいは「君が偽コンピュータの箱に入ってコンピュータのふりをしてその仕事を手作業で行うとして,どうする?」と考えさせてみるとか.

これをやらせれば、後はリファレンスマニュアルとにらめっこで頑張ればプログラムができあがるところまでは行きます。
この程度のレベルの課題ならば。

が、わたしが問題にしたいのは、「君が手でやるとしたらどうする? それを全部書き出してごらん?」 と言うヒントを投げないと、その作業にかかれない、と言うことなのです。
「何をしていい物やら、さっぱり分かりませ〜ん」 という人たちに、最初のこのヒントを投げかけてあげねばならない。
そして、この傾向は、適当な入門書と言語リファレンスの縮小版、みたいなのを読んで、プログラムを書く気になっている初学独習者、またはおざなりな教育を受けている学生ほど陥りやすいように見えるのです。

この、最初のとっかかりを懇切丁寧に教える学習書のような物を書けないものかと思いつつ、無駄に年数過ごしております・・・ orz


>19
> 基本は、やりたいことを明確にし、どうやったら実現できるか考えることでしょ?

その通りなのですが、「やりたいことを明確に」 はできたところで、「どうやったら実現できるか考える」 ことができない人が多い、と申し上げています。

> 基本がしっかりしていればCだろうがC++だろうが、JAVAだろうがコードは書けます。

これまたその通りなのですが、C と C++/JAVA では、実現方法の思考回路が異なります。(もっとも、最終的には手続き型思考に落ちるわけですが)
ですので、C でばりばりプログラム書けるぜー!なひとが C++ に移行すると、クラスって何?オブジェクト指向って何?とか言う状態のまま C// プログラムを書き続けるわけです。
この状態、C++ プログラマといえますか?
# C// は C++ を // コメントの書ける C として使っているだけの C++ プログラムを揶揄したものです

> 仕事だと、教えて君よりも自分で調べる人のほうが使えないこともあります。
> 締め切り間際になって、「自分で調べたけどわかりませんでした」、なんて言われるとね。

これに関しては、仕事の進め方の問題ですので、教えて君とか調べる君とかの問題ではないと思います。
>「君が手でやるとしたらどうする? それを全部書き出してごらん?」 と言うヒントを投げないと、その作業にかかれない、

1つには,そういうアプローチを教えて貰ってないからでしょうね.
1,2回そういう手法で先生に助けて貰って,3回目にも相変わらず先生にそう促されなければ出来ないのは,もう才能がないとか適性がないとしか....


helloWorldをHello japanに書き換えるとか言うレベルをクリヤしたあと,やりたいことを作業手順として分解して考えるってことが出来るように慣れるかならないかは1つの関門ではないかと感じています.
大学の情報学科の友達にCを教えているのですが、課題から大まかなメインルーチンと部品のサブルーチンとの分割ができないようです。一行ずつ考えてるようで。

>>Farsseさん

># C// は C++ を // コメントの書ける C として使っているだけの C++ プログラムを揶揄したものです

上手い(笑
でもC99で採用されちゃいましたね。

>> トピ主さん

http://mixi.jp/view_community.pl?id=602606

こっちの方が答えてくれるかもしれませんよ?
>>saitohさん

> やりたいことを作業手順として

自分は80年代前半にゲームを作りたくてプログラミングに足を突っ込んだ形なんですが、今はその市販ゲームはおろか同人・フリーソフトのゲームもだいぶ手が込んでいて、作りたい! という意気込みがあっても今の複雑化したプログラミング手法に足を突っ込むというのが難しい気がするんですよ。
ゲーム以外にモチベーション上がるものがないというか(俺だけかもしれませんが)。

あと友達にも言ったんですが、Cの前にHSPとかスクリプト言語から始めてはどうか? と考えています。文法ではなく「プログラムの作り方」を簡単に学ぶために(ゲームも作りやすいですし)。
スレッド立てたKREVAさんへ
あくまでも参考用にお願いします。

C++言語で、入力ストリームのバッファクリアが分からないのでループさせると厳しい状態になります。
(勝手にエンターキーをがんがん押された状況になる)
C言語なら、fflush(stdin); で入力ストリームはクリアできるんですけどね。
ひょっとしたら、getline は使用しないほうがいいかもしれません。

VS2005を使用。
リハビリを兼ねたつもりが、コンソールアプリケーションのVC++は初体験。

==========================
// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
// を記述します。
//

#pragma once


#define WIN32_LEAN_AND_MEAN // Windows ヘッダーから使用されていない部分を除外します。
#include <stdio.h>
#include <tchar.h>



// TODO: プログラムに必要な追加ヘッダーをここで参照してください。

#include <iostream>
#include <fstream>
===================================================
//
#include "stdafx.h"

#define STOPLINE fflush(stdin);getchar();fflush(stdin);
#define CINCLR fflush(stdin);

using namespace std;

int fileread(char *);
int filewrite(char *);
void allflush(void) ;

int _tmain(int argc, _TCHAR* argv[])
{
  int number = 1;
  char filename[256];

// while(number){

        cout << "[1]ファイルの読み込み" << endl;
        cout << "[2]ファイルの書き込み" << endl;

        cout << "番号を入力して下さい=>" << flush;
        cin >> number;

        cout << "ファイル名を入力して下さい=>" << flush;
        cin >> filename;

        switch( number ){
                case 1:// 読み込み
                     fileread(filename);
                     cout << "読み込み終了"<< endl;
                     break ;
                case 2:// 書き込み
                     filewrite(filename);
                     cout << "書き込み終了" << endl << flush;
                     break ;
        }
// }
    cout << flush ;
    cout << "Push Enter key";
    STOPLINE
    return 0;
}

int fileread(char *filename)
{
     char buf[512];
     ifstream inputfile( filename ) ;
     while( inputfile.getline( buf, sizeof(buf) ))
        cout << buf << endl;
    return 0;
}

int filewrite(char *filename)
{
     char buf[512];
     ofstream outfile( filename ) ;
     while(cin.getline( buf, sizeof(buf) ) )
         outfile << buf << endl ;
     return 0;
}
はて。

> C言語なら、fflush(stdin); で入力ストリームはクリアできるんですけどね。

事実ですか?
言語仕様で決められたんでしたっけ?
確か、faqでは「してはいけない」みたいな記述があったと思うのですが。
>26さん
してはいけないとどこかの本でも見たことがあります。
でも、それ以外で入力ストリームのクリアを知らないのと、
どこぞの本では、禁止されているが全く支障が無いようなこ とが書いてあったので、幾度と無く使用してました。
C言語の本は乱読しているので本のタイトルは忘れてしまいました。fflush(stdin); は某本で使えるテクニックで紹介されていて重宝しています。本来違う目的で使用するものだったらしいですが、そこら辺は覚えていないです。
本によっていいとか悪いとか、間逆な場合もあるので、しっかり動作する場合は用途的に間違っていても割り切って使用しています。
言語使用にもこだわりは無いです。
とにかく必要とされる動作をすぐに作るというのがいつも目的で、Cの言語仕様にはこだわりませんし、CとC++とプロプロセッサとバッチファイルを連動したり、プログラムでやらずリダイレクトでやっちゃったり、まあごちゃごちゃだったりします。よくないかもしれませんけどね。

余談ですが、C#ってどうでしょう?
脱線して申し訳ないけど「いいよ」って話を聞いたもんで。
まず(1)
オープンに失敗している以上,「オープンしていない」のだからクローズしてはいけない.

(2)
read/writeでエラーが起きたときはfcloseが必要 

 if(NULL == fgets(buffer, MAX_BUFFERSIZE, fp)){
    (void)fclose(fp);
    return -1;
 }

return -1ではなくそこでexit()とかabort()してるんならfcloseはさぼっても大丈夫(exit/abortの後始末を引き受けてくれる外の環境(OSとか)がある場合)だけど.

  if(EOF == fclose(fp)){
読み取りオープンした場合closeの戻り値を調べなくてもいいとおもうけど.
どうせなら perror(3)でerrnoも知らせる.

fflushは。入力ストリームに対しての動作が定義されていないことを知った上で、特定の処理系で使うのは問題ないと思います。
ただ、あの書き方ではどんな環境でもfflush(stdin)が使えるように読めます。
初心者が信じてしまうと大変なので突っ込んでみました。

> 余談ですが、C#ってどうでしょう?
> 脱線して申し訳ないけど「いいよ」って話を聞いたもんで。

個人的には使いたくないですね。
MSが信じられないし、JAVAのパクリだし。
ならば、本来、入力ストリームを初期化する場合、
どう書いたほうがベストでしょうか?
入力ストリームを初期化する一般的な手段はfopen()以外にはないのでは?

・一旦クローズして再オープン.
・TTYの場合に限り,clearerrが効くこともある

変なことをしたいのならfつき関数群ではなく,生のread/write/ioctlをつかえと.
> ならば、本来、入力ストリームを初期化する場合、
> どう書いたほうがベストでしょうか?

入力ストリームの初期化が必要となる設計は、しないのがベストじゃないのかな。
どうしても入力ストリームの初期化が必要なら、環境依存を承知で実現方法を考える。

非標準の機能を使うのが悪いなんて、誰も言ってないですよ。
処理系によってはrewind(stdin)が使われるみたいだけど、標準入力で対話処理をやろうというのが間違いだと思った。curses か conio.h か readline を使ったほうが幸せ。
入力バッファのバグのような、
入力バッファからデータを拾って消えているはずなのに残っていて・・・・無限ループ、
といった事は UNIX や その他でもあるのでしょうか?

CやC++にある文字入力系の入力バッファに関するバグっぽい仕様には本当に迷惑です。
25番のソースですが、しっかり正常動作はしますが、
while文コメントをはずして実行するといわゆる入力バッファ関係の事であることが生じます。
本当に迷惑な入力ストリームの仕様です。

ログインすると、残り6件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語とC++言語 更新情報

C言語とC++言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。