2011-02-05 2 views
1
char filePath[200]; 
printf("Enter filepath: \n"); 
fgets(filePath, 200, stdin); 
f = fopen(filePath, "r"); 

while(!feof(f)) // crashed on this line 
{ 

} 

Я не могу почему-то заставить это работать. Пожалуйста, может кто-нибудь указать, что я делаю неправильно.Динамический путь файла fopen в C

Не могли бы вы указать правильный способ написания кода для открытия пути к файлу, указанного пользователем через командную строку?

Спасибо, Freddy

ответ

0

fgets помещает конец строки в конец строки (\ r \ n в Windows). Таким образом, файл FilePath содержит мусор в конце, и файл с таким именем не существует. Я бы рекомендовал вместо этого использовать scanf("%[^\r\n]s", filePath). (scanf могут отличаться от некоторых реализаций, пожалуйста, прочитайте документацию.)

обновление: Вы должны также обеспечить не будет переполнением буфера, указав размер буфера. Например так:

char filePath[100]; 
scanf("%99[^\r\n]s", filePath); 
+1

Плохой совет - никогда не использовать 'scanf()' для ввода пользователем. –

+0

Это смертельно опасно, если вы не добавите ширину поля и не подвержены ошибкам даже тогда, когда вам нужно вручную сохранить ширину поля и размер буфера в синхронизации (вы не можете использовать 'sizeof'). –

+1

@Nikolai N Fetissov: 'scanf' с набором для сканирования * может * быть в порядке, но в этом случае он пропустил важный момент: вы должны указать максимальный размер буфера (то, что он сейчас имеет в действительности, эквивалентно 'gets'). Также обратите внимание, что со сканированием вы делаете * не * нужно «s» после закрывающей скобки, как он показывает выше. –

2

fopen(3) возвращает NULL, если он не может открыть файл. Вы всегда должны это проверять. fgets(3) делает это тоже, но ваша проблема, вероятно, является символом новой строки, который хранится в возвращаемой строке.

+0

Я понимаю, что вы говорите. Но как бы выглядел этот код, если бы вы изменили мой код выше. Я совершенно новичок в C вы видите .. Спасибо – Freddy

0

Попробуйте что-то вроде:

size_t l = strlen(filePath); 
if (filePath[l-1] == '\n') filePath[--l-1] = 0; 
if (filePath[l-1] == '\r') filePath[--l-1] = 0; 
0

Вы проверить код ошибки fgets и Еореп. Оба возвращают null, если они не удались

Смежные вопросы