()

2016-03-31 17 views
0

Soru

Açık kullanıcıya bir dosyanın adını soran bir C programı yazın klavye girişi ile dosya alır kullanarak dosya dizini girmesini alarak bir dosya açma (isim içerebilir dizin yolunu da) ve dosyayı açmaya çalışır. Program, “File open!” Veya “Dosyayı açarken hata” mesajını görüntüler (program dosyayı okumaz, sadece 'u açmaya çalışır). Kullanıcının girdisini almak için gets() öğesini kullanın()

Bu yüzden aşağıdaki kodu kullanarak bir dosya dizini yolunu okumaya çalıştım ve bu dosya dizin yolunu fopen() içine kopyalayıp dosyanın açılıp açılmayacağını doğruladım. Dosya dizin yolu, kullanıcı tarafından gets() kullanılarak girilir.

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    FILE *fp; 
    char directory[100]; 
    printf("Please enter the directory path of the file you wish to open.\n"); 
    gets(directory); 
    fp = fopen("%s,directory","r"); 
    if(fp==NULL) 
    { 
     printf("\nCannot open file."); 
    } 
    else 
    { 
     printf("\nFile open!"); 
    } 
    return 0; 
} 

MY SORUN

olursa olsun çalışmıyor ve ben oluşturdum ve işleri biliyorum diğer programlardan doğrudan dosya dizin yollarını kopyaladıktan ben ne koymak

. Herhangi bir fikir?

+2

Bkz. [Neden "gets()" kullanımı tehlikeli?) (Http://stackoverflow.com/questions/1694036/why-is-the-gets-function-dangerous-why-should-it-not ol-kullanılır). Ve öğreticisine 'gets()' kullanan bir ödev yazmak için söyleyin - asla kullanılmamalıdır. –

+1

Kullanıcı tarafından girilen dizin adını 'fopen() '- printf()' den oldukça farklı bir şekilde göstermeniz gerekir; ancak bu, notasyonları karıştırmaya çalışıyormuş gibi görünür. Kullanın: 'fp = fopen (dizin," r "):' eğer verilen isim bir dizin ise, yine de başarısız olacaktır, ancak bir dosya ise çalışacaktır. Ayrıca, iletiyi yeni satır ile başlatmak yerine (veya bazen de) yeni bir satır ile iletileri sonlandırmak iyi bir fikirdir. –

+1

Jonathan Leffler'in söylediği ikinci. Asla 'gets' kullanmayın, hiçbir koşulda. (Sesi kesmek için üzgünüm ama bu önemli.) –

cevap

1

fp = fopen ("% s, directory", "r");

Bu gerçekten kafa karıştırıcı. Neden %s ve "" kullanıyorsunuz? Doğrudan parametre olarak directory kullanın. Örneğin.

fopen(directory, "r"); // make sure _directory_ refers to file for this function to succeed 

gets da dangerous olarak kabul edilir.

+0

Evet, kullanımla birlikte gelen tehlikenin farkında olduğumun farkındayım, programda kullanmamız gereken kullanıcı girdilerinde okumamız gerektiğini belirtmiştim (Bilmiyorum) niye ya). Sadece dizin olarak parametre kullanmayı denedim ve hala çalışmayacak. –

+0

@StephenD Sadece dizin kullanmanın dediğim gibi çalışmam, fopen dosyasının ihtiyacı var. Dizini –

+0

Özür dilekleriyle birleştirmelisiniz, bende tuttum "ve bu yüzden işe yaramadı, bir milyona teşekkürler. –