【问题标题】:How to open .ttcn file using C file open functions?如何使用 C 文件打开函数打开 .ttcn 文件?
【发布时间】:2010-10-05 15:16:20
【问题描述】:

我正在研究 TTCN-3(测试和测试控制符号)脚本语言。我想为此代码文件准备指南检查器。

为此,我想将 TTCN-3 脚本文件(诸如 file.ttcn 之类的东西)的行一一读取到缓冲区中。但对我来说 fopen / sopen / open / fgetc / fscanf 无法正常工作并且无法正确读取文件。它给出了NULL。有什么办法可以将它的字符读入缓冲区。我认为 C 不能读取超过三个扩展字符的文件(如 .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;
}

【问题讨论】:

    标签: c file scripting ttcn


    【解决方案1】:

    MS-DOS 不知道长文件名,包括扩展名超过 3 个字符的文件。因此,Turbo C 提供的 CRT 很可能不会寻找您提供的名称,而是寻找截断的名称 - 或其他名称。

    Windows 方便地为这些文件提供了一个短文件名(即匹配 8.3 格式,大多数情况下以 ~1 结尾,除非您使用具有相同 8 个字符前缀的文件);发现它的一种方法是打开控制台窗口并在存储文件的文件夹中运行“dir /x”。

    找到与您的文件关联的短名称并将其修补到您的 C 源文件中。

    编辑:该死,下次我会阅读 cmets。所有功劳归于 j_random_hacker。

    【讨论】:

      【解决方案2】:

      您对扩展的假设是错误的。如果 fopen 返回 NULL,则应输出 strerror(errno) 的结果或使用 perror() 函数查看失败的原因。

      编辑:问题可能是因为你有“c:\tc\bin\hi.ttcn”。例如,在 C 中,“\t”被解释为制表符。

      你可以这样做

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

      但这非常难看,你的系统应该接受:

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

      【讨论】:

        【解决方案3】:

        既然您已经发布了代码,那么另一个问题就暴露出来了。

        下面一行:

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

        应该改为:

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

        在 C 字符串中,反斜杠 (\) 是一个转义字符,用于编码特殊字符(例如,\n 表示换行符,\t 表示制表符)。要实际使用文字反斜杠,您需要将其加倍。就目前而言,编译器实际上是在尝试打开一个名为 "C:&lt;tab&gt;c&lt;backspace&gt;in\hi.ttcn" 的文件——不用说,不存在这样的文件!

        【讨论】:

        • okok 我真是个傻瓜,我编辑了我的代码以便更好地理解,将 argv[1] 替换为文件路径,但我在粘贴时没有想到这个。谢谢
        • 放心,我们都至少犯过一次这个错误... :)
        【解决方案4】:

        最有可能的罪魁祸首是您的 Turbo C,一个古老的编译器。它在技术上是一个 DOS 编译器,而不是 Windows。这会将它的 RunTme 库限制为 8.3 文件名。升级到更新的东西 - Turbo C++ 似乎是一个合乎逻辑的继任者,但微软的 VC++ Express 也可以。

        【讨论】:

        • 如果 8.3 文件名限制是问题所在,您可以打开命令提示符窗口并使用命令 DIR /X 显示 .ttcn 文件的“短名称”版本。 (出于兼容性原因,Windows 允许任何非 8.3 格式的文件名被 8.3 格式的文件名引用。)
        • 是的,我知道,但我试图了解这种情况的解决方案。
        • 好的,谢谢 j_random_hacker 先生教我这个。我从你的评论中得到了答案。你给了我真正的答案,但在评论中需要什么。如果您将其作为答案,我会投票给您并作为正确答案接受。再次感谢您。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多