我正在研究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;
}
答案 0 :(得分:2)
您对扩展的假设是错误的。如果fopen返回NULL,则应输出strerror(errno)的结果或使用perror()函数查看失败的原因。
编辑:问题可能是因为你有“c:\ tc \ bin \ hi.ttcn”。在C中,“\ t”被解释为制表符,例如。
你可以做到
"c:\\tc\\bin\\hi.ttcn"
但这非常难看,你的系统应该接受:
"c:/tc/bin/hi.ttcn"
答案 1 :(得分:2)
最可能的罪魁祸首是你的Turbo C,一个古老的编译器。它技术上是一个DOS编译器,而不是Windows。这会将RunTme Library限制为8.3文件名。升级到更新的东西 - Turbo C ++似乎是一个合乎逻辑的继承者,但微软的VC ++ Express也可以运行。
答案 2 :(得分:2)
MS-DOS不知道长文件名,包括扩展名超过3个字符的文件。因此,Turbo C提供的CRT很可能不会查找您提供的名称,而是查找截断的名称 - 或其他内容。
Windows方便地提供短文(即匹配8.3格式,大部分时间以〜1结尾,除非你使用具有相同8字符前缀的文件)文件名;发现它的一种方法是打开一个控制台窗口,并在存储文件的文件夹中运行“dir / x”。
找到与您的文件关联的短名称,并将其修补到您的C源文件中。
编辑:Darn,我下次会阅读评论。所有学分都归j_random_hacker。
答案 3 :(得分:0)
现在您已经发布了代码,另一个问题就出现了。
以下一行:
fp=fopen("c:\tc\bin\hi.ttcn","r");
应改为:
fp=fopen("c:\\tc\\bin\\hi.ttcn","r");
在C字符串中,反斜杠(\
)是一个转义字符,用于编码特殊字符(例如\n
表示换行符{{1}一个制表符)。要实际使用文字反斜杠,您需要加倍。就目前而言,编译器实际上是在尝试打开一个名为\t
的文件 - 不用说,不存在这样的文件!