2014-10-03 11 views
5

geçersiz argüman ben forumu aradı ve bu sorunun cevabını bulamıyorum. Ortak görünmektedir, ancak belirtilen düzeltmelerin hiçbiri uygulanabilir değildir.fopen döner C

Bu dosyayı açmak için benim kodudur:

#include <stdio.h> 
#include <string.h> 

void main() { 
    FILE *input; 
    char path[200]; 

    printf("Enter the full file path and file name in the following format:" 
     "\nC:\\Users\\Username\\etc......\\filename.extension\n"); 
    fgets(path, 200, stdin); 
    printf("%s",path); 
    input=fopen(path,"r"); 
    if (input==NULL) { 
     perror("The following errors were encountered"); 
     return(-1); 
    } 
} 

printf(%s,path) doğru ben açmak istediğiniz dosyanın yolunu ve adını görüntüler, ancak fopen her zaman geçersiz argüman döndürür. Ayrıca, fopen'deki bir işaretçiyi kullanmayı denedim, ancak bu her zaman programı çöker.

+9

Bunun nedeni 'path' BTW bir sondaki satır karakteri ... – isedev

+0

içerecektir olduğunu. Ayrıca, 'dönüş' bir işlev değildir ve bu nedenle argümanı etrafında n parantezler gerektirir. – Deduplicator

+5

Bir yan notta: ana geçersiz olarak bildirildiğinde, -1 değerini döndürüyorsunuz. Bunu yapma. Ana'yi int olarak bildirin ve tüm kod yollarından bir şeyler döndürün. Bu bir kırılma hatası olmasa da, kötü bir tarz. – jpw

cevap

6

Sen fgets ile path alıyorsanız. \n, fgets tarafından geçerli bir karakter olarak kabul edilir. El ile kaldırmanız gerekiyor.

fgets(path, 200, stdin); 
path[strlen(path) - 1] = '\0'; 
+0

Bu yeterli olmayabilir; 'fgets'' bir' \ r \ n' sonlandırılmış satırını döndürebilir (bunun yapılmaması gerekir, ancak bazı eski C kütüphaneleri zaten yapılır) veya kullanıcı yanlışlıkla boşluk bırakabilir. – zwol

+1

'yol [strlen (yol) - 1]' –

+1

@Zack Ya da başarısızlığı göstermek için 'NULL' döndürülebilir. – Deduplicator

5

Senin sorunun muhtemelenfgets o kadar dönmeden önce giriş hattından sondaki '\n' kaldırmaz olduğunu. fopen neşeyle adı '\n' içeren bir dosyayı açmaya çalışır, ancak dosya adları neden "Geçersiz argüman alıyorsanız olduğunu karakteri içeren izin vermez işletim sistemi (kod anlaşılacağı gibi, varsayarak Windows kullanıyorsanız o) "mesaj. Çekirdeğin dosya adlarına çok az kısıtlama getirdiği Unix-tipi bir sistemde, bunun yerine "Böyle bir dosya veya dizin yok" olurdu. Bu nedenle, bu soruya herhangi bir cevap bulamadınız. Daha önce varyasyonları gördüğümü biliyorum.

bu deneyin:

... 
fgets(path, 200, stdin); 
char *p = path + strlen(path) - 1; 
while (isspace(*p)) p--; 
*(p+1) = '\0'; 
printf("%s\n", path); 
input = fopen(path, "r"); 
... 

Sen isspace için #include <ctype.h> gerekecektir. yerine `boşluk main` kötü, kullanmak` int main`: