2016-04-11 22 views
0

Şehirler arasında bir iletişim ağı oluşturmak için giriş verisi sağlayan bir metin dosyam var.2 satırlık C öğesini metin dosyasından doldurun

N=12 

C=[72,107,65,99,20,11,31,7,42,28,4, 31,10,57,37,71,18,17,73,39,14, 91,77,19,39,33,59,31,44,98, 71,66,36,23,10,100,93,41, 21,80,22,43,78,22,93, 77,81,49,62,89,19, 21,19,51,40,18, 102,92,28,51, 31,47,51, 73,38, 50] 

R=[0.81,0.88,0.83,0.90,0.98,0.93,0.86,0.91,0.92,0.86,0.80, 0.91,0.87,0.78,0.83,0.90,0.93,0.87,0.79,0.99,0.94, 0.88,0.98,0.97,0.96,0.92,0.81,0.99,0.92,0.91, 0.80,0.88,0.87,0.93,0.90,0.99,0.98,0.91, 0.89,0.80,0.92,0.93,0.83,0.87,0.99, 0.97,0.91,0.89,0.99,0.94,0.90, 0.87,0.89,0.95,0.85,0.96, 0.99,0.79,0.88,0.81, 0.84,0.97,0.77, 0.83,0.93, 0.99] 

a_b=1 

Req_Reliability = 0.5 

Req_Cost = 267 

: N ağ şehirlerin sayısı olan ve & R sırasıyla maliyet ve iki şehir arasında bir bağlantı uygulanması güvenilirlik veren N matrisi simetrik K. 2'nin üzerinde bir tamsayı olduğu sürece, 2 0'ın üzerinde değişiklik gösterebilir. C & R de buna göre değişecektir..

Metin dosyasından, matrisler simetrik olduğundan, matrislerin yalnızca üst yarısı verilir ve indeksler i = j olan tüm öğeler 0 olmalıdır, böylece metin dosyasındaki C matrisinin biçimi şu şekilde olur:

C=[C(1-2),C(1-3),...,C(1-12),whitespaceC(2-3),C(2-4),...,C(2-12),...,whitespaceC(11-12)] 
with C(IDstartCity-IDstopCity) 

metin dosyasında boşluk bir alt satıra bir değişiklik gösterir ve aynı yapı ne yapmak istiyorum benim C programında kendi maça her değişkeni atamak olan R.

matrix için de geçerlidir. 12'den N'ye nasıl atanacağına dair bir fikrim olsa da, C ve R matrislerinin tuhaf yapılandırmasını metin dosyasından C programındakilere nasıl atayabildiğim konusunda clueless.

int main(int argc, const char * argv[]) { 

    FILE *finput; 
    char var_name[5]; 
    int value = 0; 
    finput = fopen("Prj1_input.txt", "r"); 

    //Inputs Start 
    int N;        //Number of cities 
     //Cost Array 
    int **C = malloc(N * sizeof(int*)); 
    for (i = 0; i < N; i++) { 
     C[i] = malloc(N * sizeof(int)); 
     memset(C[i], 0, N * sizeof(int)); 
    } 

    //Reliability Array 
    double **R = malloc(N * sizeof(double*)); 
    for (i = 0; i < N; i++) { 
     R[i] = malloc(N * sizeof(double)); 
     memset(R[i], 0, N * sizeof(double)); 
    } 
    int con_cost;      //Connection cost between 2 cities 
    double con_reliability;    //Connection reliability between 2 cities 

    int a_b;       //0 is type a, 1 is type b 

    double Req_reliability, Req_cost; //reliability for type a, cost for type b 
    //Inputs Stop 


    fscanf(finput, "%c=%d", var_name, &value); 

    printf("%s %d\n", var_name, value); 



    fclose(finput); 

    return 0; 
} 

Ben iki ben metin dosyasında bir boşluk bulmak-döngüler için ben satır artırmaz kullanabilirsiniz varsayalım, ama ben metin dosyasına nasıl başa kesinlikle hiçbir fikrim yok. Ben // girdi başlangıç ​​ve // ​​giriş durağı arasındaki herşeyi kapatmaktır sağlanan Şimdilik

, çıkış N 12

Teşekkür

örnek olarak
+0

'int N; çift ​​C [N] [N], R [N] [N]; C cinsinden yasal değildir. C'deki bir dizinin boyutunu belirtmek için değişkenleri kullanamazsınız. stdlib'de bulunan işlevde yerleşik olan "malloc" dosyasına bakın. .h' dizileri dinamik olarak tahsis etmek için – JackVanier

+0

Teşekkürler, onlar daha çok yer tutucuydu, ben giriş metin dosyası okuma ile başa çıkmak için daha fazla ilgileniyorum. (Soruyu düzenleyeceğim) – darkf222

+0

metin dosyasının içeriğini olduğu gibi göster. Bu nasıl ayrıştırılacağını yönlendirecek. – ryyker

cevap

0

Al C, dizileri bir dizi yapmak ilk büyüklüğü N: O

int **C = malloc(N * sizeof(int*)); 
for (i = 0; i < N; i++) { 
    C[i] = malloc(N * sizeof(int)); 
    memset(C[i], 0, N * sizeof(int)); 
} 

döngü ve matris atamak:

char *s = "<the string inside the [...]>"; 
char *p = s, *e; 
for (i = 0; i < N; i++) { 
    for (j = i + 1; j < N; j++) { 
     e = strchr(p, ','); 
     *e = '\0'; 
     C[i][j] = atoi(p); 
     p = e + 1; 
    } 
} 
+0

R, bunun ikiye dönüştürülmesi dışında benzer. – fluter

+0

Teşekkürler! Matris atamasında kodun nasıl çalıştığını açıklayabilir misiniz? E ve p nedir? – darkf222

+0

Bu nedenle, dizeyi parantez içine aldığınızda, yalnızca virgülle ayrılmış bir dizedir, virgül aramaya devam edebilir ve bulunan jetonu tamsayıya dönüştürmek için atoi'ye besleyebilirsiniz. Bir uyarı, atoi'nin boş sonlandırılmış dizgeyi kabul etmesidir, bu yüzden virgül atlatmadan önce virgül null değerini değiştirmelisiniz. tamam – fluter

0

Tanımladığınız gibi sorun ayrıştırmaktır. Metin dosyalarınız, her biri benzersiz aranabilir içeriğe sahip satırlardan oluşur. Bu, her satırı tanımlamanıza ve ardından her biri için benzersiz ayrıştırma kurallarını ayarlamanıza yardımcı olacaktır. strtok(), C ve R hariç, satırların çoğu için iyi çalışır. Açıklama için yorumlara bakın. Başlamak için aşağıdaki şablon yeterlidir. Bu kodun gerçek değeri, fgets(), strtok(), atoi()'un birlikte nasıl çalıştığını görmek için bir hata ayıklayıcısında adım adım ilerlerseniz olacaktır.

//procedure and function prototype 
//int main(int argc, const char * argv[]) { //illegal main declaration 
int main(int argc, char * argv[]) { 

    FILE *finput; 
    char var_name[5]; 
    int value = 0; 
    char line[280];//adjust size as needed for longer content 
    int N;        //Number of cities 
    char *tok; 
    int i;//previously undeclared 

    finput = fopen(".\\Prj1_input.txt", "r"); 
    if(finput) 
    { 
     while(fgets(line, 280, finput)) 
     { 
      if(strstr (line, "N=")) //get N and create memory for arrays 
      { 
       tok = strtok(line, "N=\n \t"); 
       if(tok)//if no output, leave 
       { 
        N = atoi(tok);//read about error checking for this function 
            //in your final code you should check output for 
            //LONG_MAX or LONG_MIN and check errno 
        double **C = (double **)malloc(N * sizeof(double *)); 

        for (i=0; i<N; i++) 
        { 
         C[i] = (double *)malloc(N * sizeof(double)); 
        } 
        double **R = (double **)malloc(N * sizeof(double *)); 

        for (i=0; i<N; i++){ 
         R[i] = (double *)malloc(N * sizeof(double)); 
        } 
       } 
      } 
      if(strstr (line, "C=[")) //get C array elements 
      { 
       //because of the combination of comma and space delimiter 
       //and the fact that the count of numbers before a space is not constant 
       //between numbers, strtok is not the best way to parse this 
      } 
      if(strstr (line, "R=[")) //get R array elements 
      { 
       //same as above comment 
      } 
      if(strstr (line, "a_b=")) //get a_b value 
      { 
       //similar to parsing N 
      } 
      if(strstr (line, "Req_Reliability")) //get Req_Reliability 
      { 
       //similar to parsing N 
      } 
      if(strstr (line, "Req_Cost")) //get Req_Cost 
      { 
       //similar to parsing N 
      } 
     } 
     fclose(finput); 
    } 
    return 0; 
} 

belleği serbest unutmayın oluşturduğunuz (2Kbytes fazla): Aynı zamanda bazı yasadışı önceden varolan sözdizimi, düzeltilmiş işaret ediyor.

C ve R dizileri için, sınırlayıcınız ve diğer ölçütleriniz göz önünde bulundurulduğunda, sayıları bir başka ara arabelle depolarken, sayıları tanımlamak için 1 karakter dizisi boyunca döngü yapmak ve atoi()'u kullanarak dönüştürmek zorunda kalabilirsiniz. virgül, sonra sıradaki satırı başlatmak için geldiğiniz her alan için bir dizin artırın.

+0

Çalışmak için harika bir şablon, bunu fluter'in cevabı ile birleştirmeye çalışacağım. Teşekkürler! Req_Reliability ve Req_Cost'dan sonra "=" ifadesini – darkf222

+0

@ darkf222 - mutlaka eklemem gerektiğini tahmin ediyorum. strstr() 'sadece bir alt dizgiyi kontrol ediyor. Bu durumda testi sadece sahip olduğum şeyle geçecek. Kodu çalıştırdım, 6 koşulu başarıyla geçiyor. Ayrıca, ayrıştırma işlemini kolaylaştırmak için giriş dosyanızın içeriğini (formatını) değiştirebiliyorsanız, bunu yapacağım. Örneğin boşluklardan kurtulun. – ryyker

+0

(Ben metin dosyasında _The boşluk daha düşük row_ aracı için bir değişiklik gösterir tam olarak ne emin değilim, ancak bu söz eden diğer kriterlere de ekler kaynaklanma ihtimali büyüktür vs. imkansız, 'Strtok() kullanarak ayrıştırma yapacaktır) görmek Oh, strstr() '' aşina değildi ve bunu yapmak için doğrudur: 'fscanf (finput, "% c = [%-c]", var_name, arr_values);' arr_values' dizisini elde etmek için ' matris C ve R için? – darkf222

İlgili konular