Я пытался заставить этот код работать часами! Все, что мне нужно сделать, это открыть файл, чтобы убедиться, что он реальный и читаемый. Я новичок в C, поэтому я уверен, что есть что-то глупое, которого я пропускаю. Вот код (сокращенный, но скопировано):fopen in C on solaris
#include <stdio.h>
main() {
char fpath[200];
char file = "/test/file.this";
sprintf(fpath,"~cs4352/projects/proj0%s",file);
FILE *fp = fopen(fpath,"r");
if(fp==NULL) {
printf("There is no file on the server");
exit(1);
}
fclose(fp);
//do more stuff
}
Я также проверил, что путь правильно указать реальный файл, который я прочитал разрешение. Любые другие идеи?
Edit 1: Я знаю, что FPATH заканчивается как "~ cs4352/проекты/proj0/тест/file.this"
Edit 2: Я также попытался с помощью абсолютного файла дорожка. В обоих случаях я могу проверить, правильно ли построены пути через ls.
Редактировать 3: Там errno
is 2 ... В настоящее время я пытаюсь отслеживать, что это означает в google.
Редактировать 4: ОК, errno
из 2 «Нет такого файла или каталога». Я получаю это, когда ссылочный путь в fopen «/home/courses1/cs4352/projects/proj0/index.html», который я проверил, существует, и у меня есть права на чтение. Что касается приведенного ниже кода C, в нем может быть несколько ошибок семантики/новичка, но gcc не дает мне никаких предупреждений о времени компиляции, и код работает точно так, как он должен, за исключением того, что он говорит, что он продолжает плевать errno
из 2 Другими словами, я знаю, что все строки/char массивы работают нормально, но единственное, что может быть проблемой, это вызов fopen()
.
Хорошо, процедура access() помогла мне больше всего (и что я все еще использую, так как это меньше кода, не говоря уже о более элегантном способе его выполнения). Проблема на самом деле произошла от чего-то, что я не объяснил всем вам (потому что я не видел этого, пока не использовал access()). Чтобы разгрузить файл, я разбивал строки с помощью strtok() и делился только на «\ n», но поскольку это система UNIX, мне нужно было добавить к ней «\ r». Как только я это исправил, все встало на свои места, и я уверен, что функция fopen() будет работать, но я ее не тестировал.
Благодарим всех вас за полезные советы, и в особенности Пол Беккингем за то, что вы нашли это замечательное решение.
Cheers!
Я действительно считаю, что «~ cs4352» на самом деле не понят ОС. замените его реальным путем. ~ cs4352 просто заменяется оболочкой. но здесь нет оболочки. но, как вы говорите, вы тоже пробовали абсолютные пути. Я думаю, это еще одна проблема. –
Системная ошибка.h должна иметь список errno. В MacOS X 2 нет «такого файла или каталога». Мне нравится ответ Джо и Шт. – dmckee
просто используйте perror, он показывает ошибку в удобочитаемой форме, или strerror для перевода errno –