• 締切済み

C言語

C言語で簡単なプログラムを作っているのですが、 「テキストファイルが存在し、かつ空のテキストファイル(開いても何も書かれていない)だと、そのテキストファイルを削除する」 というコードはどうのように書けばいいのでしょうか? 現在自分が考えているのは、 #include<stdio.h> int main(){ FILE *fp; if((fp=fopen("example.txt","r"))==NULL){ printf("file not open\n"); }else if(((fp=fopen("example.txt","r"))!=NULL)&&(fgetc(fp)==NULL)){ //「ファイルがあって、中に何も書かれていない」という条件式を書きたい// remove("example.txt"); } return 0; } 大学で講義としてC言語を習っている程度の知識です。 fopenのif文の書き方があってるかどうかもわからないんですが^^; borland c++ 5.5.1を使用しています。 よろしくお願いします。

noname#207979
noname#207979

みんなの回答

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.5

#4です。 それでしたら、ファイルサイズが0かどうかで判断するのも一つの方法かと。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

「何もかかれていない」とはどういうことなのかを決める必要がありますね。 改行コードのみとか、スペース、タブのみとかはどうするのか。 逆に、完全に何もない、0バイトのファイルの場合、いったいどうやって、そのファイルがテキストかどうかを判断するのか? といったことを決めていくと、どんな処理を書けばいいのかも見えてくると思います。

noname#207979
質問者

補足

回答ありがとうございます。 >改行コードのみとか、スペース、タブのみ 考えません。 >完全に何もない0バイトのファイルをテキストファイルと見分ける 拡張子です。 中身を確認するファイルの名前と拡張子は決まっているので。

回答No.3

#include <stdio.h> int main() { int c; FILE *fp; if((fp=fopen("example.txt","r"))==NULL){ printf("file not open\n"); fclose(fp); return -1; }else if(c = getc(fp) == EOF){ fclose(fp); remove("example.txt"); } return 0; } こんな感じですかね。 補足は以下 }else if(((fp=fopen("example.txt","r"))!=NULL)&&(fgetc(fp)==NULL)) 一度ファイルの存在を確認しているので、ここで確認する必要はありません。 remove(~)の前にfclose(fp)を行っているが、これをしないとファイルが開きっぱなしのため、 ファイルの削除に失敗する。

noname#207979
質問者

お礼

回答ありがとうございます。 無事に削除できました。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>if((fp=fopen("example.txt","r"))==NULL){ ここでオープンに成功して、 >}else if(((fp=fopen("example.txt","r"))!=NULL)&&(fgetc(fp)==NULL)){ ここで、再オープンします。 共有関係のオプションとかがなければ2回目のオープンが失敗するかも知れません。 読み取りオープンなら多重に開ける。としても、先にオープンしたファイルをクローズする方法がありません。 # fp上書きしろって言われたので閉じるための情報忘れちゃった!てへぺろ。みたいな…。 で、オープンしたままのファイルを削除できるかはOS次第です。 Linuxとかだと削除できる。 Windowsだと使用中のため削除できないというエラーになるでしょうね。 >「テキストファイルが存在し、かつ空のテキストファイル(開いても何も書かれていない)だと、そのテキストファイルを削除する」 空だったら…ということなので、バイナリモードでオープンしてfseek()でファイルポインタを最後に移動するなりでファイルサイズを取得。 クローズした後で削除…とか。 掲示されたようにfread()で1バイト読み込みを試行してエラーだったらクローズしてから削除…とか。 # fgetc()の読み込み失敗はNULLではありませんよ?

noname#207979
質問者

補足

回答ありがとうございます。 バイナリモードなるものがあるのですか。調べてみます。 fgetcも初めてみたので失敗時になにをするのかもよくわかっていませんでした。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> if((fp=fopen("example.txt","r"))==NULL){ > printf("file not open\n"); は、まあ、いいとして このまま > }else if(((fp=fopen("example.txt","r"))!=NULL) とfopenすれば、二重にオープンすることになります。 上でfopenが成功した結果、elseでここに来ているのだから、ここであらためてfopenする必要は無いですよね? > &&(fgetc(fp)==NULL)){ fgetcのマニュアルを良く読んでください。 「ファイルの最後まで読んだ」時の戻り値はNULLだと書いてありますか? 私の知っているfgetcは、ファイルの最後にNULL は返しません。

関連するQ&A

  • C言語、fgetcを利用しファイルの内容を変数に

    C言語について質問です C言語のfgetcを利用しファイルの内容を変数にいれてそれを返す関数を作っているのですがうまくいきません <!--以下ソース--> char *file_get_contents(char *filename){ FILE *fp; int c; char *return_str; if((fp=fopen(filename,"r"))==NULL) return NULL; while((c=fgetc(fp))!=EOF ){ sprintf(return_str,"%c",c); } fclose(fp); return return_str; } 誰か理由と改善方法を教えてください!

  • C言語の質問です。クイズをテキストファイルに書き、それを読み込むという

    C言語の質問です。クイズをテキストファイルに書き、それを読み込むというモノなのですが、その前に前回のスコアを読み込み、棒グラフにして出力しなければいけません。また、問題も1行ずつ読み込み正否を判定します。問題のテキストは、「1,問題文 1.○○ 2,○○ 3.○○」とし、頭に解答を書いています。最後に、正解した数をスコアファイルに書き、終了とします。一応、初めてなら、スコアファイルを新規作成し、2回目ならスコアファイルを開く、というところまでは、出来ましたが、その後がどうにも進みません・・。どなたか教えて頂けないでしょうか・・。 #include <stdio.h> int main(void) { FILE *fp; char str[256]; if((fp = fopen("score.txt","r")) == NULL){  printf("このゲームを初めて実行しますね。\nスコアファイルを新規作成します。\n");  fp = fopen("score.txt","w");  fclose(fp);} else{  printf("スコアファイルを読み込みます。\n");  fp = fopen("score.txt","r");  fclose(fp);} return 0; } 一応ここまでは、出来ています。

  • C言語でCSVファイルのオープン・クローズができな

    C言語でCSVファイルのオープン・クローズができない。 下記のプログラムですが、CSVファイルが読み込めません。 どのようにすれば読み込めるのでしょうか。よろしくお願いいたします。 #include <stdio.h> int main(void) { FILE *fp; fp = fopen("aaa.csv","r"); if (fp == NULL) printf("ファイルを開けません。"); else { fclose(fp); } return(0); }

  • C言語 単語を取得するプログラム

    ファイルからアルファベットをスペース等で区切って取得するプログラムを作成しているのですが、デバグがうまくいきません。 どの部分がプログラム的におかしいか、どうすればよいか教えていただけませんでしょうか。 テキスト I have a pen. if you have a pen, please lend me your pen. abc, def.ghi jkl mno pqr..,stu vwx .yz ソースプログラム #include<stdio.h> #include<string.h> int word(char data[],FILE *fp){ char c; int n=0; data[0]='\0'; while((c=fgetc(fp))!=EOF){ if(c!=' ' && c!=',' && c!='.'){ n=strlen(data); data[n]=c; data[n+1]='\n'; } else return(n); } return(0); } int main(){ FILE *fp; char data[30]; fp=fopen("test.txt","r"); if((fp = fopen("test.txt","r"))==NULL){ printf("no file\n"); exit(1); } while((word(data,fp)!=0)){ printf("%s \n",data); } fclose(fp); return(0); }

  • テキスト→配列化→ソートをしたいのですが

    テキストファイル:test.txt 内容:カンマで区切られた数値で最大20個 を読み込んで配列に組み込んでその配列を昇順ソートする。 と言うC言語の課題が内定先の企業より出題されたのですが 今まではC#やデータベース中心だったので 全く解らず困っています。 #include <stdio.h> int main(void) { /* ファイルポインタ */ FILE *fp; int f; fp = fopen( "test.txt", "r" ); if( fp == NULL ) { puts( "test.txtが開けません" ); return 1; } while( 1 ) { f = fgetc( fp ); if( ferror( fp ) ) { /* fgetc関数に対するエラーチェック */ puts( "読み込み中にエラーが発生しました" ); fclose( fp ); return 1; } else if( feof( fp ) ) { break; } printf( "%c", f ); } printf( "\n" ); fclose( fp ); return 0; } } 他のサイト等を参考にファイルを読み込むまでは出来たのですが そこから先が全くわかりません・・・・orz どうかよろしくお願いしますm(_ _)m

  • fopen【C言語】

    C言語でファイルをオープンするときに デスクトップにあるkanjdata.txtというファイルを指定したいのですが \ や : 等色々試してみたのですがどうしてもファイルが開けません、どの様に指定すればデスクトップにあるファイルをオープンできるのでしょうか?? kanjdata.txtのある場所は C:\Documents and Settings\ユーザ\デスクトップ です、よろしくお願いいたします. 今作っているもの if( (fp = fopen("kanjdata.txt","rt") ) ==NULL ) { printf("ファイルが開けません\n") ; exit(0) ; }

  • C言語 複数指定したファイルの内容表示

    C言語の質問です。 「実行したファイル名を除いたコマンド ライン引数に、 複数個指定したすべてのファイルの内容を標準出力に表示する」 というプログラムを作成しようと思うのですが。。。 どうしても上手くいきません。 1つのファイルの内容を標準出力に表示するプログラムになってしまいます。 どなたかお力を貸してください。 ちなみに、私が作成したプログラムは、以下です。↓↓ #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; int c; if(argc != 2) { return 1; } if((fp=fopen(argv[1], "r"))==NULL) { return 1; } while((c=fgetc(fp)) !=EOF) { fputc(c, stdout); } fclose(fp); return 0; }

  • C言語 教えてください

    data.txtの中に入っているデータを読み込み、 全て出力するというプログラムを作ろうとしています。 しかし、上手く読み込み表示させることが出来ません。 自分で出来るだけ調べたのですが、 どこがおかしいのかわからないので教えてください。 ↓↓↓現在作っているプログラムです↓↓↓ #include <stdio.h> void main(void) { FILE *fp; char number, name; if ((fp = fopen("data.txt", "r")) == NULL) { printf("FILE OPEN ERROR\n"); } else { while (fscanf(fp, "%s%s", number, name) == 2) { printf("%s-%s\n", number, name); } } fclose(fp); printf("FILE CLOSE !!\n"); } ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↓↓data.txt↓↓ 001 aaa 002 bbb 003 ccc 004 ddd 005 eee ↑↑↑↑↑↑↑↑ よろしくお願いします。

  • c言語  2つのファイルを行ごとに読み込むプログラミング

    c言語  2つのファイルを行ごとに読み込むプログラミング 0.txt と 1.txt という2つのテキストフォルダがあり 0.txt の中身は a a b b 1.txt の中身は c c d d というものとします。 これら2つのフォルダを読み込むとき まず1つのフォルダの1行目(a a)を表示し 他方の1行目(c c) 2行目(d d)を表示させて 続いて1つのフォルダの2行目(b b)を表示し 他方の1行目(c c) 2行目(d d)を表示させたいのです。 つまり実行結果が a a c c a a d d b b  ←理想の実行結果です c c b b d d となるようにしたいのですが #include <stdio.h> #include <stdlib.h> #define STR_MAX 256 int main(void) { FILE *fp, *fp2; int i, j, k; char buf[STR_MAX]; char buf2[STR_MAX]; fp = fopen("0.txt", "r"); fp2 = fopen("1.txt", "r"); if (fp == NULL && fp2 == NULL){ printf("\n"); } while(fgets(buf, STR_MAX, fp) != NULL){ while(fgets(buf2, STR_MAX, fp2) != NULL){ printf("%s%s", buf,buf2); } printf("\n"); } fclose(fp); fclose(fp2); return 0; } このプログラミングの実行結果は a a c c a a d d となり、0.txtの2行目(b b)は表示されません。 おそらく while 文 を2重にすることで 不具合が起きているのだと思うのですが 色々と調べた結果、これ以外に プログラミングが思いつきません。 私の理想の実行結果にするためには どこを訂正させると良いのでしょうか? 恐れ入りますが ご回答 どうかよろしくお願いいたします。

  • C言語でセグメンテーションエラーの原因がわからず困っています。

    こんにちは。いつもお世話になっております。 C言語なのですが、何故かプログラムを実行するとセグメンテーション違反が表示されてしまい全く動きません。皆さんのお力を貸して頂けないでしょうか。 以下が問題のプログラムです。 前提条件: ・別プログラムによりfile.txtは末尾に文章が追加され続けている ・本プログラムは永劫的に動き続ける #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<errno.h> #include<signal.h> #include<sys/types.h> int main () { int i = 1, a; FILE *fp, *fp2; char *tok; //NULLを入れて初期化 char buf[1024] = ""; char str[1024] = ""; char str2[1024] = ""; //出力するファイルを開く if ((fp2 = fopen ("out.txt", "a")) == NULL) { printf ("out.txt:open error\n"); exit (-1); } while (1) { //何度もfopenするのでループ二週目以降は一旦fpを閉じる if (str2 != NULL) { fclose (fp); } //一度読み込み、2週目以降もさらに読み込み続ける if ((fp = fopen ("file.txt", "r")) == NULL) { printf ("file.txt:open error\n"); exit (-1); } //str2はループ2週目以降で使われる if (str2 != NULL) { while (1) //新しい行を見つけ出す { fgets (str, 1024, fp); if (strstr (str, str2) != NULL) { printf ("前回の最終行です:%s\n", str); break; } } } else { printf ("str2はNULLです:%s\n", str2); } //fopenで読み込んだ現段階のテキストファイルをout.txtに移す while (1) { if( (fgets (str, 1024, fp) ) == NULL)break; if ((a = strlen (str)) >= 2) { str[a - 1] = '\0'; } else { printf ("抽出した文字列が1文字以下です:%s\n", str); break; } if (strlen (str) >= 17) { strcpy (str2, str); } else { printf ("抽出した文字列が16文字以下です:%s\n", str); break; } printf ("%s\n", buf); fprintf (fp2, "%s\n", buf); strcpy (buf, ""); strcpy (str2, str); } printf ("これが検索語です:%s\n", str2); } fclose (fp2); return 0; } プログラムの内容は、 更新され続けるテキストファイル(file.txt)から、別のテキストファイル(out.txt)に出力するというプログラムです。(file.txtの内容を若干変えつつ、out.txtに出力することが本来の目的ですが、その部分は省略させて頂きました。) fopenで開くと、「その時点まで」のfile.txtしか開かれません。更新され続けているfile.txtの内容をコンスタントに読み取る為に、while文でfopenし続ける方法を取っていますが、そうするとout.txtに移し終わった行まで読み込んでしまい重複した文章をout.txtに移すことになりますので、strstrを使い、「前回fopenで開いたfile.txt」の最終行を検索してその位置からまたout.txtに移す、という方法を取りました。しかし、結果は何故かセグメンテーション違反でした。 以上のプログラムや私の意図する所で何か気づかれた点や、おかしいと思われた点等ありましたら是非ご教授頂きたく思います。 どんな些細なことでも構いませんので、教えて頂けないでしょうか。 環境はCentosです。どうぞよろしくお願いします。

専門家に質問してみよう