プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。
コマンド引数からのファル名について教えて下さい。
fn=argv[1];
fprint("%s",fn); → data.txt と出力されます。

fp = fopen(fn,"r");
とするとエラーになります。
fp = fopen("data.txt","r");
とすると読み取ります。

どういう理由か分かりません。
是非ご教示いただけましたら幸いです。
よろしくお願いいたします。

質問者からの補足コメント

  • OSはubuntu16とMacOSX Yosemiteで両方ともコンパイラはgccを使っています。
    またよろしくお願いいたします。

    No.2の回答に寄せられた補足コメントです。 補足日時:2018/05/24 16:28

A 回答 (3件)

環境や、実際に指定したファイル名とかも記載した方がいい…かも知れませんね。



>fprint("%s",fn); → data.txt と出力されます。

printf()ですよね?
printf("[%s]",fn);とかやった方がいいかも知れません。
# ファイル名の後に全角スペースとか含まれていた場合に見えない。(半角スペースと水平タブはスタートアップルーチンで処理してくれている…はずだけど)

ファイル名に半角スペースが入っている場合、コマンドライン引数での指定方法が変わるので注意が必要でしょう。
Windowsだとファイル名をダブルクォーテーションで…となりますが。(実際にfopen()に渡す時には前後のダブルクォーテーションはカットする必要があった…っけかなぁ???)
Linuxとかの場合はどうなるんだろうか…。
# bashでは\でエスケープして渡すけど…受け取った側がどうなるのか確認したことはない。(というかLinuxでそういうプログラムを組んだことがない)

>fp = fopen(fn,"r");
>とするとエラーになります。
>fp = fopen("data.txt","r");
>とすると読み取ります。

ファイル名として間違いがないのであれば…問題ないかと思われますけど…。
# カレントディレクトリについては別問題ですけども。
    • good
    • 1
この回答へのお礼

fopenの書式設定ミスでした。()が一つ不足していたために読み取れませんでした。
ありがとうございました。

お礼日時:2018/05/24 16:26

char *fn;


↑としていますか?
    • good
    • 0
この回答へのお礼

お世話になります。
>>char *fn;
はい。
()を一つ追加し忘れました。
またよろしくお願いいたします。

お礼日時:2018/05/24 16:27

以下の提示をお願いします。


1)OS及びコンパイラ名
2)エラーとなったソースの全て
3)コマンドラインで実際に実行したときのパラメータ

少なくとも、
fnの宣言の内容
argvの宣言の内容
fpの宣言の内容
fp=fopen(fn,"r");がエラーであると判断した時の方法
が不明です。

fprint("%s",fn); → data.txt と出力されます。・・・・これは
printf("%s",fn);・・・の誤りかと思われます。
この回答への補足あり
    • good
    • 0
この回答へのお礼

int main(int argc, char argv[])
chat *fn;
fp = fopen((argv[1]),"r");
printf("%s",fn);でした。

fopenの書式ミスでした。 自己解決しました。
()が一つ不足していました。
ありがとうございました。

お礼日時:2018/05/24 16:25

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