ファイル入出力について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Makoto

ファイル入出力について

#1

投稿記事 by Makoto » 3年前

本日の24:00が締め切りであるため厚かましいとは思いますが、できる限り早急な回答を頂けましたら幸いです。
実行例のようにコマンド引数に指定した整数値に基づいて描画するプログラムを作り
なさい.コマンド引数が指定されなかった場合には,エラーメッセージを表示してプ
ログラムを停止させること.
ファイル名はexB3.c
実行例
% ./exB3 1
A
% ./exB3 2
AB
AA
% ./exB3 3
ABB
AAB
AAA
% ./exB3 4
ABBB
AABB
AAAB
AAAA
% ./exB3 5
ABBBB
AABBB
AAABB
AAAAB
AAAAA
% ./exB3
コマンド引数が足りません
%

コード:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int n, i, j;
    
    n=atoi(argv[1]);

    if(argv[1]==NULL)
    {
        printf("コマンド引数が足りません\n");
        return 1;
    }
   
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=i; j++)
        {
            printf("A ");
        }

        for(j=i+1; j<=n; j++)
        {
            printf("B ");
        }
        printf("\n");
    }
    
    return 0;
}
テキストファイルexB4.txtに適当な整数を10個書き込みなさい.そのファイルから整
数を10個読み込み,総和を計算するプログラムを作成しなさい.
ファイル名はexB4.c
実行例
% ./exB4
総和は 55
%
exB4.txtの例
1
2
3
4
5
6
7
8
9
10


#include <stdio.h>
#include <stdlib.h>
int main(void)
{
// ここから
// ここまでのプログラムを書く
}

コード:

#include <stdio.h>

int main(void)
{
    FILE *fp;
    int a[10], i, j, sum;

    if((fp=fopen("exB4.txt", "w"))==NULL)
    {
        printf("ファイルオープンエラー\n");
        return 1;
    }

    for(i=0; i<10; i++)
    {
        i=i+1; 
    }

    fpinrtf(fp, "%d\n", );
         

    sum=0;

    for(j=0; j<10; j++)
    {
        sum=sum+a[j];
    }

    printf("総和は%d", sum);
    fclose(fp);

    return 0;
    
}
以下のsetMaxMin関数を定義し,2つの整数のうち大きい値をmaxが指す変数へ,小さ
い値をminが指す変数へ代入する.
void setMaxMin(int *max, int *min);
main関数では,コマンド引数を使って2つの整数を入力し,setMaxMin関数を呼んでか
ら2つの整数値を出力する. setMaxMin関数においては,ex56.c(第5回の課題6)の
swap関数を利用すること.
プログラムファイル名はexB5.c
setMaxMinおよびswap関数にはprintf, scanfを書いてはいけない.main関数にはコ
マンド引数をチェックする以外のif文を書いてはいけない.大域変数を使ってはいけ
ない.
実行例
% ./exB5
コマンド引数が足りません
% ./exB5 10
コマンド引数が足りません
% ./exB5 3 5
大きい値 5
小さい値 3
% ./exB5 4 2
大きい値 4
小さい値 2
%

#include <stdio.h>
#include <stdlib.h>
void swap(int *x, int *y);
void setMaxMin(int *max, int *min);
int main(int argc, char *argv[])
{
int a, b;
// ここから
setMaxMin( … );
// ここまでのプログラムを書く
printf("大きい値 %d¥n", a);
printf("小さい値 %d¥n", b);
return 0;
}
void swap(int *x, int *y)
{
// ここから
// ここまでのプログラムを書く
}
void setMaxMin(int *max, int *min)
{
// ここから
// ここまでのプログラムを書く
}

下記はex56.c

コード:

#include <stdio.h>

void swap(int *x, int *y);

int main(void)
{
    int a, b;
 
    printf("整数を2つ入力\n");
    scanf("%d %d", &a, &b);
    printf("swap前:%d %d\n" a, b);
    swap();
    printf("swap後:%d %d\n" a, b);
   
    return 0;
}

void swap(int *x, int *y)
{
    *y = ;    
    *x = ;
    return a, b;
}
実行例のようにコマンド引数に文字列を2つ指定し,一つ目の文字列で指定したファイ
ルに2つ目の文字列を書き込むプログラムを作成しなさい.
ファイル名はexB6.c
実行例
% ./exB6
コマンド引数が足りません
% ./exB5 exB6.txt
コマンド引数が足りません
% ./exB6 exB6.txt TXT
% cat exB6.txt
TXT
%


Makoto

Re: ファイル入出力について

#3

投稿記事 by Makoto » 3年前

hideさん、返信ありがとうございます。exB3,exB4の、どの部分が、どのように間違っているか分からないので、ご教授お願いします。

hide

Re: ファイル入出力について

#4

投稿記事 by hide » 3年前

24:00が締め切りの割にはのんびりなのですね。
exB3,exB4の、どの部分が、どのように間違っているか分からない
何をもって間違っていると判断したのかを書いてください。
"どのように間違っているのかわからない" ということは間違っている事自体は確信したのですよね?

とりあえずexB4には 19行目の構文エラーでビルドが通らないですよね。

アバター
みけCAT
記事: 6390
登録日時: 10年前
住所: 千葉県
連絡を取る:

Re: ファイル入出力について

#5

投稿記事 by みけCAT » 3年前

Makoto さんが書きました:exB3,exB4の、どの部分が、どのように間違っているか分からないので、ご教授お願いします。
exB3

コード:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int n, i, j;
    
    n=atoi(argv[1]); /* NULLチェックの前にNULLかもしれない値を渡している */

    if(argv[1]==NULL)
    {
        printf("コマンド引数が足りません\n");
        return 1;
    }
   
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=i; j++)
        {
            printf("A "); /* 余計な空白が入っている */
        }

        for(j=i+1; j<=n; j++)
        {
            printf("B "); /* 余計な空白が入っている */
        }
        printf("\n");
    }
    
    return 0;
}
exB4

コード:

#include <stdio.h>

int main(void)
{
    FILE *fp;
    int a[10], i, j, sum; /* あってはいけない場所に全角スペースがある */

    if((fp=fopen("exB4.txt", "w"))==NULL)
    {
        printf("ファイルオープンエラー\n");
        return 1;
    }

    for(i=0; i<10; i++)
    {
        /* 数値を出力していない */
        i=i+1; /* iの値を二重に増やしてしまっている */
    }

    fpinrtf(fp, "%d\n", ); /* 関数名スペルミス、書き込むデータが書かれていない */
         

    sum=0;

    for(j=0; j<10; j++)
    {
        sum=sum+a[j]; /* 未初期化の自動変数の値を計算に使用している */
    }

    printf("総和は%d", sum);
    fclose(fp);

    /* ファイルを読み込む部分が全く無い */
    return 0;
    
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Makoto

Re: ファイル入出力について

#6

投稿記事 by Makoto » 3年前

みけCATさん、返信ありがとうございます。exB3の8行目が混乱して分からなくなっているので、もう少しヒントを教えて頂けないでしょうか?

アバター
purin52002
記事: 235
登録日時: 4年前
連絡を取る:

Re: ファイル入出力について

#7

投稿記事 by purin52002 » 3年前

みけCATさんではないですがお答えします。

exB3の8行目:
n=atoi(argv[1]); /* NULLチェックの前にNULLかもしれない値を渡している */

ここで argv[1] にはプログラム実行時に入力された値が入ります。
% ./exB3 1
という風に実行した場合は 1 が入ります。

じゃあもしも何も入力されなかったとしたらどうなるでしょうか?
% ./exB3
という風に実行した場合 argv[1] にはどんな値が入るでしょうか?

仮に何か値が入っていたとして、それは使ってもいい値なのでしょうか?
(このプログラムだと argv[1] の値を使ってループを回している)

っていう感じのヒントはどうでしょうか?^p^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

Makoto

Re: ファイル入出力について

#8

投稿記事 by Makoto » 3年前

purin52002さん返信ありがとうございます。いくら考えても分からなかったので答えを教えて頂けないでしょうか?

かずま

Re: ファイル入出力について

#9

投稿記事 by かずま » 3年前

割り算で、ゼロで割ってはいけないことはご存知ですよね。
そこで、次のようなプログラムを書いたとします。

コード:

#include <stdio.h>

int main(void)
{
    int a, b, c;
    scanf("%d%d", &a,  &b);
    c = a / b;
    if (b == 0) {
        printf("ゼロで割ることはできません\n");
        return 1;
    }    
    printf("%d / %d = %d\n", a, b, c);
    return 0;
}
ちゃんと割る数の b がゼロかどうかチェックしています。
でも、このプログラムがダメなことは分かりますよね。

exB3 のプログラムに戻りましょう。
atoi() には、"5" のような文字列を渡さないといけません。
NULL を渡してはいけないのです。
だから、argv[1] が NULL かどうかチェックしていますが、
それは n = atoi(argv[1]); を実行した後です。手遅れです。

% ./exB3 のとき、
 argc = 1, argv[0] = "./exB3", argv[1] = NULL
% ./exB3 5 のとき、
 argc = 1, argv[0] = "./exB3", argv[1] = "5", argv[2] = NULL

argv[1] は NULL になったり、"5" になったりします。

何が分からなかったのですか?
argv の意味ですか?
atoi の仕様ですか?

かずま

Re: ファイル入出力について

#10

投稿記事 by かずま » 3年前

かずま さんが書きました:% ./exB3 5 のとき、
 argc = 1, argv[0] = "./exB3", argv[1] = "5", argv[2] = NULL
argc = 2 です。訂正します。

Makoto

Re: ファイル入出力について

#11

投稿記事 by Makoto » 3年前

argvもatoiも、あまりはっきりと分かっていませんでしたが解決できました!かずまさん、purin52002さん、みけCATさん、ありがとうございました!

かずま

Re: ファイル入出力について

#12

投稿記事 by かずま » 3年前

Makoto さんが書きました:argvもatoiも、あまりはっきりと分かっていませんでしたが解決できました!
解決したプログラムを提示してください。

かずま

Re: ファイル入出力について

#13

投稿記事 by かずま » 3年前

exB4 もまだ解決していないのではありませんか?
Makoto さんが書きました:テキストファイルexB4.txtに適当な整数を10個書き込みなさい.そのファイルから整
数を10個読み込み,総和を計算するプログラムを作成しなさい.
ファイル名はexB4.c
この問題で作るプログラムは、テキストファイルexB4.txtから
整数を10個読み込み,総和を計算するだけのものであって、
exB4.txt は、エディタで作れば良いのだと思います。

Makoto

Re: ファイル入出力について

#14

投稿記事 by Makoto » 3年前

exB3

コード:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int n, i, j;

    if(argv[1]==NULL)
    {
        printf("コマンド引数が足りません\n");
        return 1;
    }

    n=atoi(argv[1]);

    for(i=1; i<=n; i++)
    {
        for(j=1; j<=i; j++)
        {
            printf("A ");
        }

        for(j=i+1; j<=n; j++)
        {
            printf("B ");
        }
        printf("\n");
    }
    
    return 0;
}
exB4はexB3の前に解決できました!

返信

“C言語何でも質問掲示板” へ戻る