1

これがなぜなのか、何か考えがあります:

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

int nrpart;
int k;

void main()
{
    printf("lol");
    freopen("p2.in","r",stdin);
    freopen("p2.out","w",stdout);
    printf("roar");
}

出力のみ笑?freopen を何度か使用しましたが、現在は機能していないようで、その理由がわかりません。

4

2 に答える 2

3

ファイルをチェックしてくださいp2.out。2回目の呼び出しで印刷されたテキストprintfがそこにあるため、標準出力がそのファイルにリダイレクトされます。セグメンテーション違反はありませんでした。でも、いい冗談です。

于 2012-12-21T14:13:08.207 に答える
0

書かれたコードは、セグメンテーション違反を引き起こしません(少なくとも私にとっては)。あなたが見せていないものがもっとない限り、それがどのようにあなたのためにそれをしているのかわかりません.

のドキュメントfreopen()特に戻り値に関する部分を確認してください。

ファイルが正常に再オープンされた場合、関数はパラメーター stream として渡されたポインターを返します。これは、再オープンされたストリームを識別するために使用できます。それ以外の場合は、ヌル ポインターが返されます。ほとんどのライブラリ実装では、errno 変数も、失敗時にシステム固有のエラー コードに設定されます。

そのため、新しくリダイレ​​クトされたストリームを使用する前に、戻り値と errno 値を確認してください。エラーの原因である可能性があります。

行の前にコードが segfaulted の場合printf("roar");、それが表示されない理由です。その後セグメンテーション違反が発生した場合は、「roar」がファイルにあるはずですp2.out

重要な注意事項:プログラムの最後にfclose stdinとを忘れないでください。stdoutこれらはそれぞれ と にリダイレクトされるp2.inようp2.outになったので、使い終わったら閉じる必要があります。

于 2012-12-21T14:47:46.513 に答える