Как открыть файл .ttcn, используя функции открытия файлов C? - PullRequest
0 голосов
/ 05 февраля 2009

Я работаю на языке сценариев TTCN-3 (Testing and Test Control Notation). Я хотел подготовить к проверке руководящих принципов для этого кода файлов.

Для этого я хочу прочитать строки файла сценария TTCN-3 (что-то вроде file.ttcn) одну за другой в буфер. Но для меня fopen / sopen / open / fgetc / fscanf не могут работать должным образом и неправильно читают файл. Это дает NULL. Есть ли способ, которым я могу прочитать символы этого в буфер. Я думаю, что C не может читать файлы с более чем тремя символами расширения (например, .ttcn). Простите, если мое предположение неверно.

Моя среда - Turbo C на Windows.

Редактировать :

Да, я также проверил эти ошибки, но они дают неизвестную ошибку для чтения () и такой файл или каталог не существует.

Мой код выглядит следующим образом

#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 ]

2 голосов
/ 05 февраля 2009

MS-DOS не знает о длинных именах файлов, включая файлы с расширениями более 3 символов. Поэтому CRT, предоставляемый Turbo C, скорее всего, ищет не имя, которое вы предоставляете, а усеченное - или что-то еще.

В Windows удобно предоставить короткое (т.е. соответствующее формату 8.3, большую часть времени заканчивающееся на ~ 1, если вы не играете с файлами с одинаковым 8-символьным префиксом) для них; Один из способов обнаружить это - открыть окно консоли и запустить «dir / x» в папке, где хранится ваш файл.

Найдите короткое имя, связанное с вашим файлом, и вставьте его в исходный файл C.

Редактировать: Черт, я прочитаю комментарии в следующий раз. Все кредиты для j_random_hacker.

2 голосов
/ 05 февраля 2009

Наиболее вероятный виновник - ваш Turbo C, древний компилятор. Технически это компилятор DOS, а не Windows. Это ограничит библиотеку RunTme до 8,3 имен файлов. Обновление до чего-то более нового - Turbo C ++ кажется логическим преемником, но Microsoft VC ++ Express тоже подойдет.

2 голосов
/ 05 февраля 2009

Ваше предположение неверно относительно расширений. Если fopen возвращает NULL, вы должны вывести результат strerror (errno) или использовать функцию perror (), чтобы узнать, почему это не удалось.

Редактировать : Возможно, проблема в том, что у вас "c: \ tc \ bin \ hi.ttcn". в C "\ t" интерпретируется, например, как tab.

Вы могли бы сделать

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

Но это очень уродливо, и ваша система должна принять:

"c:/tc/bin/hi.ttcn"
0 голосов
/ 05 февраля 2009

Теперь, когда вы разместили код, выявляется еще одна проблема.

Следующая строка:

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

Вместо этого следует читать:

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

В строках C обратная косая черта (\) представляет собой escape-символ , который используется для кодирования специальных символов (например, \n представляет символ новой строки, \t символ табуляции). Чтобы фактически использовать буквенную обратную косую черту, вам нужно удвоить ее. На самом деле, компилятор пытается открыть файл с именем "C:<tab>c<backspace>in\hi.ttcn" - разумеется, такого файла не существует!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...