【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22129

ファイル入出力
投稿者---neko(2005/07/26 14:21:24)


こちらのサイトの17-1を変更修正しました。
読み込むファイルはb.txtです。
読み込んでMS-DOSプロンプトに表示したくて、
下記の通りにしましたが、表示されませんでした。
どのように修正したらよろしいでしょうか?
お手数ですが、よろしくお願いします。

/*** ファイルコピーのプログラム例 ***/
#include    <stdio.h>
#include    <stdlib.h>

int main(void)
{
    FILE    *fin,*fout;
    char    infile[40],outfile[40],s[256];

    printf("入力ファイル名=");
    gets(infile);
    if( (fin=fopen(infile,"a"))==NULL) {            /* 入力ファイルオープン */
        printf("入力ファイルがオープンできません\n");
        exit(1);
    }
    while(fgets(s,256,fin)!=NULL) {  /* 入力ファイルから読み込んだデータを */
        printf("%s", s);→ここでMS-DOSプロンプトに表示したかった。
    }
    fclose(fin);                        /* 入力ファイルクローズ */

    return 0;
}





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ファイル入出力 22131 REE 2005/07/26 15:14:48


No.22131

Re:ファイル入出力
投稿者---REE(2005/07/26 15:14:48)


> if( (fin=fopen(infile,"a"))==NULL) { /* 入力ファイルオープン */

これでは書き込み用のオープンになってしまいます。
fopenの第二引数について、もう一度確認してみましょう。



この投稿にコメントする

削除パスワード

No.22133

Re:ファイル入出力
投稿者---neko(2005/07/26 15:43:38)


ありがとうございます。

>これでは書き込み用のオープンになってしまいます。
>fopenの第二引数について、もう一度確認してみましょう。

はい。モードが"a"ですと表示されないことに気がついてたのですが、
(理由が分からない)
printfで表示してscanfで入力したものを同じファイルに追加したかったのです。
いろいろと調べましたが、どのようにしたらいいのか分かりませんでしたのでよろしくお願いします。




この投稿にコメントする

削除パスワード

No.22135

Re:ファイル入出力
投稿者---とおり(2005/07/26 16:24:26)


>>これでは書き込み用のオープンになってしまいます。
>>fopenの第二引数について、もう一度確認してみましょう。
>
>はい。モードが"a"ですと表示されないことに気がついてたのですが、
>(理由が分からない)
>printfで表示してscanfで入力したものを同じファイルに追加したかったのです。
>いろいろと調べましたが、どのようにしたらいいのか分かりませんでしたのでよろしくお願いします。

17-2の「モード」において、"a"は「追加書込み専用」とあります。
ファイルを読込む場合は "r"(など)を使用します。


この投稿にコメントする

削除パスワード

No.22159

Re:ファイル入出力
投稿者---neko(2005/07/26 23:18:14)


ありがとうございます。

>17-2の「モード」において、"a"は「追加書込み専用」とあります。
>ファイルを読込む場合は "r"(など)を使用します。

そうですね。
書き込みと読み込みを同時にしたかったので、
"a+"としたらうまくいきました。

入力を終了したい時に"1"または"2"以外は
入力出来ないように制限をかけたいのですが、
どのようにすればよろしいのでしょうか?
下記の方法は制限がかかりません。
お手数ですが、よろしくお願いします。

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

int main(void)
{
    FILE    *fin,*fout;
    char    infile[40],outfile[40],s[256], add[256];
    int end = 2;

    while (1) {
        if( (fin=fopen("b.txt","a+"))==NULL) {      /* 入力ファイルオープン */
            printf("入力ファイルがオープンできません\n");
            exit(1);
        }
        
        printf("終了?(1:yes 2:no)\n");
        scanf("%d", &end);
        if (end == 1) {
            break;
        }
        else if (end == 2) {
        }
        else {
            printf("入力ミス\n");
        }
        while(fgets(s,256,fin)!=NULL) {  /* 入力ファイルから読み込んだデータを */
            printf("%s", s);
            printf("\n追加文字\n");
            scanf("%s", add);
            fprintf(fin ,"%s" , add);
        }
        fclose(fin);                        /* 入力ファイルクローズ */
    }

    return 0;
}





この投稿にコメントする

削除パスワード

No.22172

Re:ファイル入出力
投稿者---とおり(2005/07/27 09:14:06)


>入力を終了したい時に"1"または"2"以外は
>入力出来ないように制限をかけたいのですが、
>どのようにすればよろしいのでしょうか?
>下記の方法は制限がかかりません。
>お手数ですが、よろしくお願いします。

"1"または"2"以外が入力された場合は、再度"1"または"2"を入力させたいということでしょうか?
それとも、"1"または"2"以外は表示すらさせたくないということでしょうか?

前者の場合、、printf("入力ミス\n"); の次に continue; を加えればできると思います。
後者の場合、、、できるのかなぁ??入力文字を判定して即時消すようにすればできるか???
、、、ちょっとわからない。
ちなみに、提示されたコードでは、"1"が入力された場合にファイルが開きっぱなしになるようです。


この投稿にコメントする

削除パスワード

No.22175

Re:ファイル入出力
投稿者---まきじ(2005/07/27 10:18:27)


>printf("終了?(1:yes 2:no)\n");
>scanf("%d", &end);

の部分を do-while で、繰り返せば良いと思います。


この投稿にコメントする

削除パスワード

No.22180

Re:ファイル入出力
投稿者---neko(2005/07/27 10:56:22)


とおりさん、まきじさん ありがとうございました。

>printf("入力ミス\n"); の次に continue; を加えればできると思います。

それもやってみました。可能でした。
ですが、1、2以外のキー入力をさせたくなかったのです。

ということで、下記の通りにしました。
(この場合3を入力した時だけループに入るのに)
なぜか1、2、3を入力してもdo〜while文を繰り返してしまいます。
なぜでしょうか?
お手数ですが、よろしくお願いします。


        do {
            printf("終了?(1:yes 2:no)\n");
            scanf("%d", &end);
            printf("end = %d\n", end);
        } while (end !=1 || end !=2);
        if (end == 1) {
            break;
        }




この投稿にコメントする

削除パスワード

No.22182

Re:ファイル入出力
投稿者---まきじ(2005/07/27 11:08:02)


>} while (end !=1 || end !=2);

|| ではなく && では?


この投稿にコメントする

削除パスワード

No.22183

Re:ファイル入出力
投稿者---neko(2005/07/27 11:14:08)


ありがとうございます。

>|| ではなく && では?
はい。修正しましたら直りました。



この投稿にコメントする

削除パスワード

No.22184

Re:ファイル入出力
投稿者---とおり(2005/07/27 11:14:21)


>とおりさん、まきじさん ありがとうございました。
>
>>printf("入力ミス\n"); の次に continue; を加えればできると思います。
>
>それもやってみました。可能でした。
>ですが、1、2以外のキー入力をさせたくなかったのです。

この意味が分かりかねます。
可能なのにできない??

>ということで、下記の通りにしました。
>(この場合3を入力した時だけループに入るのに)
>なぜか1、2、3を入力してもdo〜while文を繰り返してしまいます。
>なぜでしょうか?

仕様(どのような結果を得たいのか)の全体像が見えないので何ともいえませんが、
while (end !=1 || end !=2);

while (end !=1 && end !=2);
じゃないと、常に真です。



この投稿にコメントする

削除パスワード

No.22188

Re:ファイル入出力
投稿者---neko(2005/07/27 11:28:54)


どうもありがとうございます。

>この意味が分かりかねます。
>可能なのにできない??

すみません。私が間違っていました。
同じようにできました。

>while (end !=1 && end !=2);
>じゃないと、常に真です。

はい。直りました。
ありがとうございました。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧