Я пытался заставить этот код работать часами! Все, что мне нужно сделать, это открыть файл, чтобы увидеть, является ли он реальным и читаемым. Я новичок в C, так что я уверен, что есть что-то глупое, что я скучаю. Вот код (сокращенно, но скопированный):
#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
}
Я также проверил, что путь правильно указывает реальный файл, к которому у меня есть разрешения на чтение. Есть другие идеи?
Редактировать 1: Я знаю, что fpath заканчивается как "~ cs4352 / projects / proj0 / test / file.this"
Редактировать 2: Я также пробовал использовать абсолютный путь к файлу. В обоих случаях я могу проверить правильность построения путей с помощью ls.
Редактировать 3: Там errno
равно 2 ... В настоящее время я пытаюсь отследить, что это значит в Google.
Редактировать 4: Хорошо, errno
из 2: «Нет такого файла или каталога». Я получаю это, когда ссылочный путь в fopen - "/home/courses1/cs4352/projects/proj0/index.html", который, как я подтвердил, существует, и у меня есть права на чтение. Что касается кода C, перечисленного ниже, в нем может быть несколько семантических ошибок / ошибок новичка, но gcc не дает мне никаких предупреждений во время компиляции, и код работает точно так, как должен, за исключением того, что он говорит, что он продолжает выплевывать errno
из 2. Другими словами, я знаю, что все массивы strings / char работают правильно, но единственное, что может вызвать проблемы, - это вызов fopen()
.
Решение: Хорошо, процедура access () - это то, что мне помогло больше всего (и что я до сих пор использую, так как это меньше кода, не говоря уже о более элегантном способе сделать это). Проблема на самом деле возникла из-за того, что я не объяснил вам всем (потому что я не видел ее, пока не использовал access ()). Чтобы извлечь файл, я разбивал строки с помощью strtok () и разбивал только на «\ n», но, поскольку это система UNIX, мне нужно было также добавить «\ r» к ней. Как только я это исправил, все стало на свои места, и я уверен, что функция fopen () также будет работать, но я не проверял это.
Спасибо всем за ваши полезные советы, и особенно Полу Бекингему за то, что он нашел это замечательное решение.
Ура!