東京工芸大学 工学部  電子機械学科  2年 前期 

基礎プログラミング 第11回
 2017.6.20 
藤木 文彦

http://fujiki.tv/t-kougei/kisoprog/
fujiki.kougei@gmail.com  


1. ファイルへのデータ出力 fileout 

ファイルを出力のために”オープン"する fileout.open()

 C言語でデータをファイルへ出力したり、入力する処理を行う場合には、プログラム中でファイル名を指定して、「これからこのファイルを使用します。」という準備をします。

ファイルに出力するには、 cout を使うときと同じ様に、

fileout << "Hello"

のようにします。繰り返し使うと、1行ずつ追加されていきます。
最後に、

fileout.close()

として、使用終了を宣言します。


  (例題1) 

Project1101

 // Project1101.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "iostream"
#include "fstream"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
        int a=12345;
        char *s="これは、新しいファイルです。";
        ofstream fileout;
        fileout.open("text1.txt");
        if(!fileout ){
                cout << "ファイルオープン 失敗\n";
                return 1;
        }
        else
        {
                fileout <<"Hello\n";
                fileout << a << "\n";
                fileout << s << "\n";
                for ( int i=0; i<10; i++ ){
                        fileout << i*111 << "\n";
                }
                fileout << "Hello\n";
        }
        fileout.close();
        cout << "text1txt" << "ファイルに出力しました。";
        getchar();
        getchar();
        return 0;
}


これだけだと、本当にプログラムが正しく実行されたのか分かりません。
もし正しく実行されていれば、

Z:\My Documents\Visual Studio 2012\Projects\Project1101\Project1101
(場所の表示は少し違うかも知れないが、自分の作成しているプロジェクトのデータの置かれた場所をエクスプローラで探してみること。)
( Project1101\Project1101   のように、2段階になっているはずなので注意。)

に,
text1.txt
というファイルが出来ているはずです。

ダブルクリックするとエディタが開いて内容が表示されるはずです。内容は、

Hello
12345
これは、新しいファイルです。
0
111
222
333
444
555
666
777
888
999
Hello

のようになっていると思いますので、確認して下さい。


 次に、出力したファイルを読み込んで出力するプログラムの例を示します。
プログラム前半は、 Project1101 と同じです。

 【演習問題1】 


 上記プログラムの一部を次のように書き換えなさい。

 出力ファイル名を、" myfile-1101.txt " とします。

 書き出す数値を 0から9 までの 111 倍ではなく、
        20 から 29 までの 123 倍 とします。

 ファイルの最後の出力文字を " Hello " ではなく" これでおわりです。 " とします。

 以上の変更点を加えて動かしたら、
  実行した 画面
  出力されたファイルの中身をエディタで見たもの
  プログラムの主要部分
 を、コピーしてメールに貼り付け、  "Project1101" として送りなさい。


2.ファイルからの入力 filein


ファイルを入力のために使用する宣言が filein.open です。そのほかの使い方は fileout と似ていますので、特に説明の必要は無いでしょう。

  (例題2) 

Project1102

 // Project1102.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "iostream"
#include "fstream"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
// 以下、前半は Project1101 と同じ

        int a=12345;
        char *s="これは、新しいファイルです。";
        ofstream fileout;
        fileout.open("text1.txt");
        if(!fileout ){
                cout << "ファイルオープン 失敗\n";
                return 1;
        }
        else
        {
                fileout <<"Hello\n";
                fileout << a << "\n";
                fileout << s << "\n";
                for ( int i=0; i<10; i++ ){
                        fileout << i*111 << "\n";
                }
                fileout << "Hello\n";
        }
        fileout.close();
        cout << "text1txt" << "ファイルに出力しました。";

// ここから下が追加分
        cout << "Enter キーを押して下さい。\n";
        getchar();

        ifstream filein;
        int count=0;
        char s2[100];
        filein.open("text1.txt");
        if(!filein ){
                cout << "入力ファイルオープン失敗\n";
                return 1;
        }
        else
        {
 #              while ( ( filein >> s2 ) != 0 ){
              while ( ( filein >> s2 ) ){
                        count++;
                        cout << count <<" : ";
                        cout << s2 << "\n";
                }
        }
        getchar();
        return 0;
}


 【演習問題2】 


 上記プログラムの一部を次のように書き換えなさい。

 入出力ファイル名を、" myfile-1102.txt " とします。


  画面への出力の際、先頭に、

" 1: "    "  2: "    などの行数が表示されるようになっている部分を
" 1行目は  〜  です。 "  " 2行目は  〜   です。 " などとなるようにしなさい。 ( 〜 の部分には、ファイルの内容が入る)

 以上の変更点を加えて動かしたら、
  実行した 画面
  プログラムの主要部分
 を、コピーしてメールに貼り付け、  "Project1102" として送りなさい。

3.ファイル名をキーボードから入力する




  (例題3) 

Project1103

 ファイル名を指定する方法

 入出力ファイル名を、実行時にキーボードから入力する方法で行います。

 なお、以下のプログラムでは、既に存在するファイルと同じ名前のファイルを指定したときにも、エラーにならずに、強制的に上書きしてしまいますから、注意して下さい。
 上書き確認を求める方法は、あとの演習で行います。

Project1103

 // Project1103.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "iostream"
#include "fstream"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
        char filename[100];
        char s[100];

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

        ofstream fileout;
        fileout.open( filename );
        if(!fileout ){
                cout << "出力ファイルが開けません。\n";
                return 1;
        }
        else
        {
                cout <<" 成功 \n";

                fileout <<"このファイル名は ";
                fileout << filename ;
                fileout << " です。\n";

                for ( int i=0; i<10; i++ ){
                        fileout << i*111 << "\n";
                }
        }
        fileout.close();
        cout << "Enter キーを押して下さい。\n";
        getchar();
        getchar();

        ifstream filein;
        char s2[100];
        int count=0;

        filein.open( filename);
        if(!filein ){
                cout << "入力ファイルオープン失敗\n";
                return 1;
        }
        else
        {
                while( (filein >> s2) !=0 ){
                        count++;
                        cout << count << " : ";
                        cout << s2 << "\n";
                }
        }

        getchar();
        return 0;
}

 【演習問題3】 

 上記プログラムの一部を次のように書き換えなさい。

 出力ファイル名を、" out-1103.dat  " とします。

 出力する数値データを、1から30 までのあいだにある、3の倍数としなさい。

 以上の変更点を加えて動かしたら、
  実行した 画面
  プログラムの主要部分
 を、コピーしてメールに貼り付け、  "Project1103" として送りなさい。


4.ファイルの内容を読み込む際のデータの型

 ファイルに対する出力は、数値であっても、「文字列」に変えて出力されます。

従って、次のように、文字と数値が混在しているファイル、複数のデータが1行に書かれているファイルは、読み込みの時にちゃんと指定しないとおかしな事になります。

  (例題4) 

Project1104
(このプログラムは、実行時におかしな表示の出るところがあります。)

 // Project1104.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "iostream"
#include "fstream"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
        char *filename="data1.txt";
        ofstream fileout;
        fileout.open( filename );
        if(!fileout ){
                cout << "出力ファイルが開けません。\n";
                return 1;
        }
        else
        {
                cout <<" 成功 \n";
       
                fileout << "1 name\n";
                fileout << "2 name2\n";
        }
        fileout.close();

        cout << "Enter キーを押して下さい。\n";
        getchar();

        ifstream filein;
        char s2[100],s3[100];
        int count=0;
        int x2,x3;

        filein.open( filename);
        if(!filein ){
                cout << "入力ファイルオープン失敗\n";
                return 1;
        }
        else
        {
                filein >> s2 >> s3;
                count++;
                cout << count <<": ";
                cout << s2 <<" - " << s3 << "\n";

                filein >> x2 >> x3;
                count++;
                cout << count << ": ";
                cout << x2 <<" - "<< x3 << "\n";
        }
        filein.close();

        getchar();
        return 0;
}


文字型変数ならばどんなデータを受けてもエラーになりませんが、数値型データは、合致する数値型以外のデータ受け取るとエラー(おかしなデータ)になります。

 【演習問題4】 

 上記プログラムの一部を次のように書き換えなさい。

 出力ファイル名を、実行時に、キーボードから入力できるようにしなさい。
 そして、実行時には、ファイル名として、" out-1104.dat  " として実行しなさい。

 ファイルに書き出すデータを、次のようにしなさい。ただし、数値だけの部分は、半角数字、文字を含む部分は、半角数値+全角文字とします。

  1   1行目のデータ  111
 2  2行目のデータ     222

 ファイルに書き出したあと、正しく読み込んで画面に表示しなさい。ただし、 3項目目のデータは、3倍して表示するものとします。つまり、次のような表示が画面上に出るようにします。

  1   1行目のデータ   333
 2  2行目のデータ     666


 以上の変更点を加えて動かしたら、
  実行した 画面
  プログラムの主要部分
 を、コピーしてメールに貼り付け、  "Project1104" として送りなさい。


5.文字を数値に変換する atoi( )
 出力の幅を指定する setw( )

入力されたデータが、文字か数値かわからない時には、とりあえず、文字として受けておいて、その後、必要な部分を、文字から数値に変換して計算する、という方法を使います。

atoi( ) を使います。これは、 ascii to int (文字型から整数型へ)という意味です。

setw(8) 8桁の欄を設けて、次の出力(1項目だけに適用)を行う。

iostream  include


  (例題5) 

Project1105

(下記プログラムにはエラーが含まれています。)

 // Project1105.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "iostream"
#include "fstream"

//出力書式設定のために必要
#include "iomanip"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
        char *filename="data2.txt";
        ofstream fileout;
        fileout.open( filename );
        if(!fileout ){
                cout << "出力ファイルが開けません。\n";
                return 1;
        }
        else
        {
                cout <<" 成功 \n";
                fileout << "123 \n";
                fileout << "456 789\n";
        }
        fileout.close();
        cout << "Enter キーを押して下さい。\n";
        getchar();

        ifstream filein;
        char s2[100],s3[100];
        int count=0;
        int x2,x3;

        filein.open( filename);
        if(!filein ){
                cout << "入力ファイルオープン失敗\n";
                return 1;
        }
        else
        {
                filein >> s2 ;
                count++;
                cout << count << ": ";

// atoi( )  文字を数字とみなして、数値に変換する。
                x2=atoi(s2);
                x2 *= 100;

// setw( ) で、出力書式幅を設定してから出力する。
                cout << setw(8) << x2 ;

                filein >> s2;
                count++;
                cout << count << ": ";
                x2=s2;
                x2 *= 100;
                cout << setw(8) << x2 <<"\n";
        }

        filein.close();
        getchar();
        return 0;
}


 【演習問題5】 


 上記プログラムのエラーを修正して、かつ、次のように、2行目は、2つの数値について、出力されるようにプログラムを追加して実行してみなさい。

 出力

   12300
   45600   78900



 以上の変更点を加えて動かしたら、
  実行した 画面
  プログラムの主要部分
 を、コピーしてメールに貼り付け、  "Project1105" として送りなさい。

6.入力によって処理を分ける。 switch( ) case ' ': break; default:

変数の値によって処理を分ける方法として、if 文を使うほかに、switch case 文を使う方法があります。
この方法は、変数が文字のときに使うと便利ですが、書き方が特徴的ですので注意してください。

 特に、 case 'x' :
の最後は、 ; ではなく : です。

                switch( a ){
                        case '+':
                                a の内容が '+' という文字のときの処理
                                break;
                        case '-':
                                 a の内容が '-' という文字のときの処理
                                break;
                        default:
                                上記に該当しない場合の処理
                }


  (例題6) 

Project1106

 // Project1106.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "iostream"
#include "fstream"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{

        char calc;
        while ( 1 == 1 ){
                cout << "+ - または、他の文字を入力して下さい。(qで終了)";
                cin >> calc;
                if( calc == 'q' ){
                        cout << "入力終了\n";
                        break;
                }
                cout << calc ;

                switch( calc ){
                        case '+':
                                cout << "Plus +++\n";
                                break;
                        case '-':
                                cout << "Minus ---\n";
                                break;
                        default:
                                cout << "Other\n";
                }
        }
        getchar();
        getchar();
        return 1;


 【演習問題6】 

 上記プログラムを改良して、次のように入力することで、入力した値(自然数)の 加減乗除のいずれかの結果を返すようにしなさい。
ただし、除算の場合は、商と余りを表示するものとします。

 数値1を入力: 100
 数値2を入力: 7
 演算を入力してください: /

 商: 14
 余: 2



 

以下は準備中


  7.方程式の解の近似値を求める(ニュートン法に類似の方法)

  (例題7) 

Project1107

 【演習問題7】 

 

★2つの配列を使ったデータの並び替え