2016-03-29 24 views
0

Giriş ve çıkış dosya adlarını komut satırı bağımsız değişkenleri aracılığıyla almaya çalışıyorum. Ben sadece getopt kullanıyorum (eğer daha iyi bir yol varsa söyleyin) ve ben segmentation faultKomut satırı bağımsız değişkenlerini kullanırken bölüm hatası

Ben segmentasyon hatasına, giriş dosyasının adı neden olduğundan eminim. Giriş dosyasının adını komut satırından aldığımda bazı şeyler yanlış gidiyor. İşte

benim kodudur: Ben scanf kullanarak infile ve outFile adını alır çünkü eğer benim freads ve fwrites ile hiçbir sorun yoktur eminim

int main (int argc, char **argv) { 

    char const *inFile = NULL; //I think the error is here 
           //an inFile that doesn't exist 
           //would cause a segmentation fault 
    char const *outFile = "outfile.txt"; 
    double val; 
    int xFlg= 0; 
    int c; 
    char *rm; //I need this for strtod, but I can use atoi instead 

    while ((c = getopt (argc, argv, "xo")) != -1) { 
     switch (c) { 
      case 'x': 
       val = strtod(optarg, &rm); 
       xFlg = 1; 
       break; 
      case 'o': 
       outFile = optarg; 
       break; 
      default: 
       help(); //void function that prints help 
       return EXIT_FAILURE; 
     } 
     rm=NULL; 
    } 
    inFile = *(argv + optind); 

    fread code 
    . 
    . 
    . 
    call function 
    . 
    . 
    . 
    fwrite code 
} 

, her şey mükemmel çalışıyor, benim yok bölümleme hatası al.

İşlevimi çalıştırıp çalıştırmamaya karar vermek için xflg değerini kullanıyorum. val, işlevimin aldığı değerdir.

./run -x 3.14 -o outputfilename.txt Düzenleme

inputfilename.txt: Bu benim ulaşmak istediğim şey

void xFunc (input1, input2, val, xFlg) { 
    if (xFlg == 1) { 
     function code 
     . 
     . 
     . 
    } else { 
    return; //don't run the function if the user doesn't type -x 
      //into command line. 
      //I don't know if this is the proper way to do this. 
    } 
} 

: Burada

benim fonksiyonudur:

Giriş dosya adını almak için aşağıdakileri yaparsam, segmentasyon hatası oluşmaz:

Eğer başka bir değer atanamıyor bir const char* başlatıldı kez

char const *inFile = NULL; 
...... 
inFile = *(argv + optind); 

:

char inFile[100]; 
printf("Name of input file: \n"); 
scanf("%99s",somestring); 
+1

gerekirse, dosya işaretçisini değiştirebilir Bu şekilde? –

+0

Hata ile derleme yapar ve inFile'ı açarken çöker. Scanf kullanarak inFile adını almaya çalıştım ve işe yarıyor. – user6005857

+1

Sorunuzu düzenleyin ve kilitlenmenin oluştuğu kodu ekleyin. –

cevap

2

sorun iki yönlüdür. Yani bu düzeltmek için aşağıdakilerden birini deneyebilirsiniz:

..... 
char const * inFile = *(argv + optind); 
..... 

sen bunu bu ince olmalıdır başlatmak noktaya infile işaretçisi kadar gerekmiyorsa.

VEYA

char inFile[20]; //whatever size you need 
...... 
strcpy(inFile, *(argv + optind)); 

Nerede tam olarak çökmesine yok

+0

Bu bölümleme hatası sorununu ortadan kaldırdı. Şimdi inFile dosyasını okuyabiliyorum ve bunu inFile içinden bazı değerler yazdırmak suretiyle doğruladım. Ama benim xFunc işlevim çalışmıyor. – user6005857

+0

bununla ilgili fazla bir şey söyleyemiyorum ... Kodun herhangi bir yerinde çağrıldığını görmüyorum (emin olun ... yorumlarda bununla ilgili bir şey söylüyorsunuz ama bu bir işe yaramaz), ne de bir işlev görüyorum prototype veya devam etmek için bir şey ..... her nasılsa, bu fonksiyon kodu olmayabilir ama ne beklediğiniz argümanlar değeri beklediğiniz düşünün ... – Pandrei

+0

@Pandrei: 'char const * inFile' olduğunu const char * inFile ile aynıdır. Char'e sabit bir işaretçi değil, sabit karakterin bir göstericisi olarak inFile'ı bildirir. Bunu bildirdikten sonra 'inFile' değişkenine atayabilirsiniz, ancak' * inFile' veya 'inFile [index]' olarak atayamazsınız. –

İlgili konular