ソースには一切手を加えず、(5)ファイルのクローズでエラー表示させる方法はないでしょうか。

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

int main(void)
{
FILE *fp;/* (1)ファイルポインタの宣言 */
char s[256];

/* (2)ファイルのオープン */
/* ここで、ファイルポインタを取得する */
if ((fp = fopen("smpl.txt", "r")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE);/* (3)エラーの場合は通常、異常終了する */
}

/* (4)ファイルの読み(書き)*/
while (fgets(s, 256, fp) != NULL) {

/* ここではfgets()により1行単位で読み出し */
printf("%s", s);
}
if((fclose(fp)) == EOF){/* (5)ファイルのクローズ */
Logging(cfancname, 2);
printf("ファイルクローズに失敗しました\n");
return -1;
}

return 0;
}

宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

本題とは関係ないのですが、


> exit(EXIT_FAILURE); /* (3)エラーの場合は通常、異常終了する */
> return -1;
> return 0;
統一が取れていないのと、-1を返すのはあまりよろしくないかと。
上から順に、
return EXIT_FAILURE;
return EXIT_FAILURE;
return EXIT_SUCCESS;
とするか、
return 1;
return 1;
return 0;
がいいかと。
    • good
    • 0

たぶん、fclose()がエラーのケースで、


Loggingやprintfが正しく動作するか
走行確認したいのだと思いますが、
おそらくfclose()のエラーは、入力パラメータ(ファイルポインタ)が
不正なケースでしか発生しないと思います。
http://www.linux.or.jp/JM/html/LDP_man-pages/man …

私だったら、
if((fclose(fp)) == EOF){ /* (5)ファイルのクローズ */
の実行直前に、デバッガでfpの値をNULLに変更して続行させます。
    • good
    • 0

本物じゃないfopen~fcloseを作りリンクしてテストするしかないでしょう。


http://yougo.ascii.jp/caltar/%E3%82%B9%E3%82%BF% …
こういう場合に使うモジュールをスタブと呼びます。
    • good
    • 0

要は、動作確認をしたいが、動作確認後、ソースを変えたくない


というのが、質問の趣旨であれば、
int ret;の変数を確保し
if((fclose(fp)) == EOF){ /* (5)ファイルのクローズ */

ret = fclose(fp); (1)
if (ret == EOF){  (2)
の2行に分けます。
デバッガで(1)を実行した後、(2)で止めます。
その後、ret にEOFの値をセットします。
その後、実行を再会します。
もちろん、デバッグ完了後も、
ソースは(1)と(2)に分けたままにしておきます。
    • good
    • 0

環境依存かつとてもシビアなタイミングになりうるけど「ファイルが存在するデバイスそのものを切り離す」とかやるとできるかもしれない.


「(5)ファイルのクローズでエラー表示させる」の意味が今一つ分かりませんが. 純粋に「fclose の中でエラー表示させる」という意味だとむしろ「どれだけプログラムをいじっても無駄」だし.
    • good
    • 0

ソースに手を加えない、という条件下では、むずかしいのではないでしょうか。


もっとも、私が知らないだけかもしれませんけれど…。
    • good
    • 0

このQ&Aに関連する人気のQ&A

FC 意味」に関するQ&A: Close to Youの意味

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qディズニーリゾートのキャスト

今ディズニーリゾートのキャストの募集をしており、少し興味を持ちました。しかし、八王子在住で大学1年なので、週5日は出来ません。その上、現在の募集状況ではミドルがなく、オープンがわずか、クローズが少しある程度です。(特別な資格・免許は持っていませんが)職種は特にこだわっていません。オープンで(始発)京王八王子駅or八王子駅~(7時過ぎ)舞浜、クローズで(22時過ぎ)舞浜~(終電近く)京王八王子駅or八王子駅、のようになると予想しています。

 こんな状況では、キャストになるのは難しいでしょうか。8月6日(土)までが面接の予約期限なので、その前日(8月5日(金))までに回答をしてくれると助かります。勝手な質問ですが、宜しくお願いします。

Aベストアンサー

こんばんは。

八王子周辺にも新聞の折り込み求人広告でディズニーリゾートの募集が載っているのであちらも通勤圏内としてみているんでしょうね。

学生で舞浜まで通うとなるとかなり大変ですが、簡単には辞めないという熱意があれば出来ると思います。
旦那の知り合いで多摩地域からランドのキャストのバイトをしていた子がそのままオリエンタルランドに就職していました。

キャストでもセミオーダーの制服貸与ですし、かなり研修なども時間をかけてするみたいです。そういった企業側の姿勢とキャストの熱意で「夢の国」はつくられているので、そのあたりのことを少し勉強して面接に行くといいと思いますよ。

Qtry{}catch(){}とデストラクタの関係を教えてください。

try-catchでメモリ確保を含むクラスをスローした場合、デストラクタはどの時点で働くのか、教えてください。たとえば、↓の使いかたは大丈夫でしょうか?

【1】
try{
 throw(CError(100, "エラー情報"));
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
}

【2】
try{
 CError err(100, "エラー情報");
 throw(err); // (1)
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
 //まだデストラクタはちゃんと動作するのでしょうか?
 //catchが呼び出し元のメンバであったりしても大丈夫なのでしょうか?
}

宜しくお願いします。

Aベストアンサー

【1】【2】どちらの場合も問題がありません。
コンパイラが必要に応じてerrオブジェクトのコピーを作成します。
デストラクタが呼び出されるタイミングはコンパイラに依存するところもあると思いますが、
例えばVC7.1では【2】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) CErrorクラスのテンポラリオブジェクト(以下a)のコピーコンストラクタが呼び出される。
(3) errオブジェクトのデストラクタが呼び出される
(4) catch文まで到達
(5) aオブジェクトのデストラクタが呼び出される。

VC7.1では、【1】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) catch文まで到達
(3) errオブジェクトのデストラクタが呼び出される。

コンパイラがオブジェクトのコピーを省略しているようです。

Qディズニーキャスト採用についてです

はじめまして!私は23歳の女です。
27日にディズニーキャスト面接をうけたものです。
第一希望は接客でアトラクションで、働き方は土日両日を含むタイプです。
現在お仕事を行っておらず、キャストのお仕事一本でがんばっていこうと考えています。

そして27日中にありがたいことに、お電話をいただけました。

シーのフードのお仕事で、クローズの時間帯でした。

私はオープンかミドルでお仕事をしたいと考えていまして、今回は見送らせていただこうかなと考えています。
「接客であればどんなお仕事でもいいので、オープンか、ミドルでお仕事をいただきたいのですが」
とお伝えしようと思っています。
この場合、次の連絡はなかなかいただけないでしょうか?

断るのが凄く勇気がいりまして・・
本当にやりたいお仕事なので、このままお返事したほうが・・ともゆれます。

明日にはお返事をしなくてはならないので、緊急です。

ご経験者の方、アドバイスいただけるかた、
どうぞよろしくお願いいたします。

Aベストアンサー

キャスト面接で、「シーのフードのお仕事で、クローズの時間帯」という結果は、あなたにとって、不採用に等しいのであれば、お断りした方が良いでしょう。クローズの時間帯だと、帰宅する時間がかなり遅くなるし、仕事もキャストではなく、フードですから、次の機会までレベルアップして再挑戦なさったら如何でしょうか。

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

Q漫画のクローズZEROについて

漫画のクローズZEROについてです。
本屋に行ったらクローズZEROという漫画があったのですが
クローズとは何が違うんでしょうか?
あとワーストは連載とまっているんですか?

Aベストアンサー

クローズの主人公は転校生坊屋春道の2年時からスタートします。(作画高橋ヒロシ)

クローズZERO(原作高橋ヒロシ、画内藤ケンイチロウ)は映画から出まして春道の転校前、後の春道の仲間、ポン・マコ・ヒロミが入学した時の3年生が中心に描かれています。主人公は滝谷源治。

ですので時代設定的に学年が違いますので基本的な関連はいまのところありません。(鈴蘭高校や武装戦線は当然出てきますが)

いまのところ共通しているのは上記のポン・マコ・ヒロミに阪東・リンダマンあたりです。

ワーストは現在22巻くらいかな。その時点で完結になっていないのでまだ続いていると思いますが。(月刊チャンピオンを見ればわかるのでしょうけど)

Qfgets((char*)&rbof,sizeof(ADR),fp) != NULL )

第2種情報処理技術者試験 平成7年春 午後 問7
http://www.bohyoh.com/ITEE/C/1995A07.html


中盤の
「while (fgets( (char*)&rbuf , sizeof(ADR), fp )!= NULL ) 」
が読めません

(char*)&rbuf , sizeof(ADR), fp
ファイルポインタからsizeof(ADR)サイズの分だけ取り出した文字を変数(char*)&rbufにほおりこむ

これが自分なりの解釈です
ですが「(char*)&rbuf」が意味不明。。。


根本的に解釈が間違っているのだと思います


詳しくわかる方教えてください

Aベストアンサー

rbufはADR型の構造体です。

&rbufは、ADR型の構造体rbufの実体へのポインタです。

つまり「&rbuf」は「(ADR *)&rbuf」です。

fgetsの引数は「char *」「size_t」「FILE *」ですから
fgets(&rbuf,sizeof(ADR),fp)
と書くと「char *」であるべき引数に「ADR *」を渡す事になります。

すると、コンパイラは「なにしてんねん。fgetsの1番目の引数はchar *やねんで。ADR *を渡されても困るねん」って言って、エラーになります。

なので「&rbufはADR *じゃなくて、char *だと思ってくれ」と書く必要があります。それが「(char *)&rbuf」と言う書き方です。

これを「型キャスト」と言います。

以下の例を参考に、考えてみて下さい。

typedef struct {
  (略)
} ADR;
(略)
  union PTR {
    char *char_ptr;
    ADR *adr_ptr;
  } ptr;
  ADR rbuf;
(略)
  ptr.adr_ptr = &rbuf;
(略)
  fgets(ptr.char_ptr,sizeof(ADR),fp);

この例は、ADR *とchar *を共有する共用体「ptr」を使用し「rbufのポインタ」を「ADR *型のadr_ptr」で受け取り、そのポインタを「char *型のchar_ptr」で参照しています。

つまり「型キャストを使用しないで書くと、上記のように共用体を使うなど、面倒な事をしなきゃなんない」のです。

これが、型キャストを使えば、
typedef struct {
  (略)
} ADR;
(略)
  ADR rbuf;
  fgets((char *)&rbuf,sizeof(ADR),fp);
だけで済んじゃうのです。

rbufはADR型の構造体です。

&rbufは、ADR型の構造体rbufの実体へのポインタです。

つまり「&rbuf」は「(ADR *)&rbuf」です。

fgetsの引数は「char *」「size_t」「FILE *」ですから
fgets(&rbuf,sizeof(ADR),fp)
と書くと「char *」であるべき引数に「ADR *」を渡す事になります。

すると、コンパイラは「なにしてんねん。fgetsの1番目の引数はchar *やねんで。ADR *を渡されても困るねん」って言って、エラーになります。

なので「&rbufはADR *じゃなくて、char *だと思ってくれ」と書く必要が...続きを読む

Qクローズで生きる決意をしたが故の悩み

失業保険300日を経てなおクローズで働いてる人に質問です。

クローズにしてる後ろめたさや世間から見られる自分と、自分が望む世間のギャップに苦しむことありますか?

私はそれでかなり悩んでるので、クローズで働けたとしても失業保険貰う前と後では見る世界がかなり変わりました。

Aベストアンサー

クローズにしてても後ろめたさは感じないでいいと思いますが。
あなたは騙してる気持ちになってしまうんじゃないですか。
あなたは周りの人に申し訳ないような気持ちになってしまうのかもしれませんね。
けど精神的病気って病院へ行けば病気だと診断される人でも
病院に行かなかったら病気にも関わらず普通に働いていますよね。
それだけ精神的病気は微妙って思います。
クローズにしたなら
症状が出た時
それは病気ではなく性格として見られる。
後ろめたさより逆にクローズにしてる本人の方が辛いかもしれませんよ。
けどクローズで行けそうなら
後ろめたさは考えないで自分の出来る範囲でコミュニケーションに気を遣ってq(^-^q)
それでいいと思いますよ。

Qchar AA[]{"全角文字"};から"全"という一字を取り出したい

 今晩は、Cの初心者です、宜しくお願いします。
 全角文字の入ったchar AA[]{"全角文字"};から"全"という文字一字を取り出す時にAA[0]とかくとエラーになります。
 どのようにしたら取り出せるのでしょう。
 ポインタを使う方法と使わない方法を教えて下さい。
 宜しくお願いします。

Aベストアンサー

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出す必要があります。

>char AA[]={'全','角'};

char AA[]="全角";
とし
>printf("%s%s\n" , AA[0],AA[1] ) ;

printf("%c%c\n" , AA[0],AA[1] ) ;
とすれば、「全」だけを表示する事が可能と思われます。

日本語を文字列で表示する為の文字コードについては
Shift-JISだけでなく、UnicodeやUTF・EUC・JISなどがあります。

もう少し詳しく記載してあるホームページはないか探してみましたが、ちょっと無理でした。

参考URL:http://marupeke296.com/CPP_charUnicodeWideChar.html

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出...続きを読む

Q「セッションのクローズ」と「CDのクローズ」

セッションをクローズし、CDをクローズしなければ、音楽用のCDプレイヤーで再生できて、しかもパソコンのCD-Rドライブで曲を追加できるのですか?

Aベストアンサー

はい、出来ます。しかし、セッションをクローズ後に追加したトラックは、一般のCDプレーヤーでは再生できません。パソコンやごく一部のプレーヤーなら追加部分の再生も可能です。

過去に似た質問に回答していますのでご覧ください。↓

参考URL:http://www.okweb.ne.jp/kotaeru.php3?q=45637

Qprintf( " %2d", p * q );

以下のプログラムは算数の九九を表示させるプログラムです。
 
#include <stdio.h>
int main()
{
int p, q;

for( p = 1 ; p <= 9 ; p++ ){
for( q = 1 ; q <= 9 ; q++ )
printf( " %2d", p * q );

printf( "\n" );
}

return 0;
}
 以上のプログラムの中に「printf( " %2d", p * q );」とあります。 
%2dは何を表しているのか分かりません?
 (マス目みたいに縦9行、横9列きれいにそろうのも不思議なのですが?
   これは次回の質問に回します。)
よろしくお願いいたします。

Aベストアンサー

プログラムが動いているようですので、試してみればいいと思います。


 ・%2d
 ・%02d
 ・%d
 ・%4d
 ・%04d

上記5通りくらい試して出力を比較すれば、

> (マス目みたいに縦9行、横9列きれいにそろうのも不思議なのですが?
>   これは次回の質問に回します。)

この疑問の答えも出てくるでしょう。

どうでしょうか。


人気Q&Aランキング

おすすめ情報