Диагноз в другом вопросе является поддельным
Как отмечается в комментариях, диагноз в другом вопросе является поддельным.В частности, цикл в myfopen()
, который гласит:
for (fp =_iob; fp <_iob + OPEN_MAX; fp++)
if ((fp->flag & (_READ | _WRITE)) == 0)
break;
, является совершенно правильным.Он перебирает элементы массива _iob
и никогда не встречает нулевой указатель, как заявлено.Буфер _iob
инициализируется для первых трех элементов;остальные - все нули.
Возможные причины неполадок
Наиболее вероятные причины сбоя этой программы:
- Не указано аргумента для именифайл.
- Указанное имя не может быть открыто для чтения.
Код, указанный для main()
:
int main(int argc, char *argv[])
{
myFILE *fp;
int c;
if((fp=myfopen(argv[1], "r"))!=NULL)
write(1, "opened\n", sizeof("opened\n"));
while((c=getc(fp))!=EOF)
write(1, &c, sizeof(c));
return 0;
}
Код не проверяетсядля любой из этих общих проблем.Это должно быть больше похоже на:
int main(int argc, char *argv[])
{
myFILE *fp;
int c;
if (argc != 2)
{
static const char usage[] = "Usage: mystdio filename\n";
write(2, usage, sizeof(usage)-1);
return 1;
}
if ((fp = myfopen(argv[1], "r")) == NULL)
{
static const char filenotopened[] = "mystdio: failed to open file ";
write(2, filenotopened, sizeof(filenotopened)-1);
write(2, argv[1], strlen(argv[1]));
write(2, "\n", 1);
return 1;
}
write(1, "opened\n", sizeof("opened\n"));
while ((c = getc(fp)) != EOF)
write(1, &c, sizeof(c));
return 0;
}
Вы должны добавить #include <string.h>
, потому что это использует strlen()
.Сообщение об ошибках с помощью файлового дескриптора ввода-вывода является неуклюжим, но этот код исключает использование обычных функций из <stdio.h>
.Программа включает в себя <stdlib.h>
, поэтому можно было бы написать exit(EXIT_FAILURE);
вместо return 1;
, но чистый результат такой же, когда текущая функция равна main()
- хотя не в функциях, вызываемых (прямо или косвенно) изmain()
.