0

私は TTCN-3 (Testing and Test Control Notation) スクリプト言語に取り組んでいます。このコードファイルのガイドラインチェッカーを準備したかったのです。

そのために、TTCN-3 スクリプト ファイル ( file.ttcn のようなもの) の行を 1 行ずつバッファーに読み込みます。しかし、私にとって fopen / sopen / open / fgetc / fscanf は正しく機能せず、ファイルを正しく読み取っていません。NULLを与えています。その文字をバッファに読み込む方法はありますか。C は、拡張子が 3 文字を超えるファイル (.ttcn など) を読み取ることができないと思います。私の仮定が間違っていたら許してください。

私の環境は、WindowsのTurbo Cです。

編集

はい、これらのエラーも確認しましたが、read() に対して不明なエラーが発生しており、そのようなファイルまたはディレクトリは存在しません。

私のコードは次のとおりです

#include <errno.h>
 #include <io.h>
 #include <fcntl.h>
 #include <sys\stat.h>
 #include <process.h>
 #include <share.h>
 #include <stdio.h>

 int main(void)
 {
    int handle;
    int status;
    int i=0;
    char ch;

    FILE *fp;
    char *buffer;
    char *buf;
    clrscr();
    handle = sopen("c:\\tc\\bin\\hi.ttcn", O_BINARY, SH_DENYNONE, S_IREAD); 

/ここでも O_TEXT などを使用しました/

    if (!handle)
    {
       printf("sopen failed\n");
   //    exit(1);
    }

   printf("\nObtained string %s @",buf);

    close(handle);

    fp=fopen("c:\\tc\\bin\\hi.ttcn","r");  \\sorry for the old version of one slash
   if(fp==NULL)                            \\I was doing it with argv[1] for opening 
   {                                       \\user given file name 
     printf("\nCannot open file");
   }
    ch=fgetc(fp);
   i=0;
   while(i<10)
   {
     printf("\ncharacter is %c  %d",ch,ch);
     i++;                                    //Here I wanted to take characters into 
     ch=fgetc(fp);                           //buffer   
   }
   getch();
   return 0;
}
4

4 に答える 4

2

最も可能性の高い原因は、古いコンパイラである Turbo C です。技術的には、Windows ではなく DOS コンパイラです。これにより、RunTme ライブラリのファイル名が 8.3 に制限されます。新しいものへのアップグレード - Turbo C++ は論理的な後継者のように見えますが、Microsoft の VC++ Express も同様に機能します。

于 2009-02-05T10:02:19.753 に答える
2

拡張機能に関するあなたの仮定は間違っています。fopen が NULL を返す場合は、strerror(errno) の結果を出力するか、perror() 関数を使用して失敗した理由を確認する必要があります。

編集:問題はおそらく「c:\ tc\bin\hi.ttcn」があるためです。たとえば、C では、「\t」はタブとして解釈されます。

あなたができる

"c:\\tc\\bin\\hi.ttcn"

しかし、これは非常に醜いので、システムは次のことを受け入れる必要があります。

"c:/tc/bin/hi.ttcn"
于 2009-02-05T09:39:37.863 に答える
0

コードを投稿したので、別の問題が明らかになります。

次の行:

fp=fopen("c:\tc\bin\hi.ttcn","r");

代わりに読む必要があります:

fp=fopen("c:\\tc\\bin\\hi.ttcn","r");

C文字列では、円記号(\)は、特殊文字をエンコードするために使用されるエスケープ文字\nです(たとえば、改行文字、\tタブ文字を表します)。文字通りの円記号を実際に使用するには、それを2倍にする必要があります。現状では、コンパイラは実際にという名前のファイルを開こうとしています"C:<tab>c<backspace>in\hi.ttcn"-言うまでもなく、そのようなファイルは存在しません!

于 2009-02-05T10:57:29.517 に答える