掲示板ランキング  水着  着ぐるみ・コスチューム  雨具


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

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

掲示板1

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

No.6746

ファイル入出力
投稿者---さくはる(2006/11/18 19:08:13)


ファイル入出力に関するプログラムがうまくかけません。

指定としては
1、入力ファイル、出力ファイル名をscanf等で入力できるようにする
2、「I am Nancy. My brother is・・・.」というファイルを
「I am Nancy.
My brother is・・・.」
のように変換して出力ファイルに出力する

というものです.
以下まで作成しました.




#include <stdio.h>
main(){
  int c;
  char string[100];
  FILE *sfile;

  printf("enter filename: ");
  scanf("%s",string);
  if((sfile=fopen(string,"r"))==NULL){
    fprintf(stderr,"cannot open %s\n",string);
    exit(1);
  }
  while((c=fgetc(sfile))!=EOF){
    putchar(c);
  }
  fclose(sfile);
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ファイル入出力 6747 επιστημη 2006/11/18 19:21:27


No.6747

Re:ファイル入出力
投稿者---επιστημη(2006/11/18 19:21:27)


>1、入力ファイル、出力ファイル名をscanf等で入力できるようにする
>2、「I am Nancy. My brother is・・・.」というファイルを
>「I am Nancy.
> My brother is・・・.」
>のように変換して出力ファイルに出力する
>というものです.

変換規則を明確にしてください。
「'.'で改行する」ですか?
ならば

 while((c=fgetc(sfile))!=EOF){
  putchar(c);
  if ( c が '.' である) {
   putchar(改行コード);
  }
 }

でオシマイです。
画面でなくファイルに書きたいのならputchar改めfputcでしょうか。



この投稿にコメントする

削除パスワード

No.6810

Re:ファイル入出力
投稿者---yaku(2006/11/28 12:05:49)


> while((c=fgetc(sfile))!=EOF){
>  putchar(c);
>  if ( c が '.' である) {
>   putchar(改行コード);
>  }
> }
>
>でオシマイです。
>画面でなくファイルに書きたいのならputchar改めfputcでしょうか。



これを参考にさせてもらいプログラムを作ってみました。
以下は一部です。

while((buf = fgetc(st_in)) != EOF){
   
   if(buf != '.' | '!' | '?' | '\n' | '\t'){
      fputc(buf, st_out);
    }
    else if(buf == '\n' | '\t'){
      fputc('\0', st_out);
    }
    else if(buf == '.' | '!' | '?'){
      fputtc('\n', st_out);
    }
    
  }




このプログラムでは出力ファイルに、何もなかったように
ただコピーされてしまうだけです。

一文一行の形で出力ファイルに書き出すにはどうしたらよいのでしょうか。


この投稿にコメントする

削除パスワード

No.6811

Re:ファイル入出力
投稿者---nop(2006/11/28 12:28:33)


> if(buf != '.' | '!' | '?' | '\n' | '\t'){

if( buf!='.' || buf!='!' || buf!='?' || buf!='\n' || buf!='\t' ){

の間違いでは?


この投稿にコメントする

削除パスワード

No.6812

Re:ファイル入出力
投稿者---yaku(2006/11/28 13:09:17)


>> if(buf != '.' | '!' | '?' | '\n' | '\t'){
>
>if( buf!='.' || buf!='!' || buf!='?' || buf!='\n' || buf!='\t' ){
>
>の間違いでは?

確かに、おっしゃる通りですね。

while((buf = fgetc(st_in)) != EOF){
   
   if(buf != '.' || buf!='!' || buf!='?' || buf!='\n' || buf!='\t'){
      fputc(buf, st_out);
    }
    else if(buf == '\n' || buf=='\t'){
      fputc('\0', st_out);
    }
    else if(buf == '.' ||buf== '!' || buf=='?'){
      fputc('\n', st_out);
    }
    
  }



しかし、このように直してはみたものの、
結果にかわりがありません...

根本的に「改行を削除する」「.で改行する」といったところが
いまいちどの様にしたらよいのかわかりません。

どうかご教授お願いします。


この投稿にコメントする

削除パスワード

No.6813

Re:ファイル入出力
投稿者---「」(2006/11/28 13:21:31)


if(buf != '.' || buf!='!' || buf!='?' || buf!='\n' || buf!='\t'){
の||は&&でないと、常に真です。
同じ内容なのはそのためでしょう。

他にもありますが、ここを直せば先に進めると思います。


この投稿にコメントする

削除パスワード

No.6823

Re:ファイル入出力
投稿者---επιστημη(2006/11/28 18:02:58)
http://blogs.wankuma.com/episteme/


>if(buf != '.' || buf!='!' || buf!='?' || buf!='\n' || buf!='\t'){

...なにやってんだか。



この投稿にコメントする

削除パスワード

No.6847

Re:ファイル入出力
投稿者---砂塵(2006/12/04 00:58:29)


>根本的に「改行を削除する」「.で改行する」といったところが
>いまいちどの様にしたらよいのかわかりません。

初めまして、砂塵と申します。

恐らく意図しない出力の原因になっているのは

1.改行文字を見つけた時に'\0'を出力しています。
 この場合、何も出力せず、処理を先に進める必要があります。

2.改行が行われる文字を読み込んだ際に、改行文字のみを出力しています。
 この場合、読み込んだ文字も出力されなければなりません。

書き込み処理に問題があるのは恐らくこの二点だと思います。
一応ソースを添付致しますのでよろしければ参考にして下さい。

while ((c = fgetc(in)) != EOF) {

        switch (c) {

        case '.':case '?':case '!':

           //読み込んだ文字と改行を出力
            fputc(c , out);
            fputc('\n' , out);

            break;

        case '\n':case '\r':

            //書き込みを行わず処理を続行

            break;

        default:

            fputc(c , out);

            break;
        }
}


投稿が長くなってしまったことをお詫びいたします。
では、失礼致します。


この投稿にコメントする

削除パスワード

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





掲示板提供:(有)リアル・インテグリティ