2015-10-04 84 views
-2

我一直在這個問題上停留了一段時間。從輸入文件中提取數據?

我創建一個程序,在一個輸入文件中讀取(只是一個簡單的.txt)這個輸入文件存儲在以下格式的變量:

x 
21 
% This is a comment 
y 
3 

等。我的目標是讀取此輸入文件(完成),然後將文件中的每個變量存儲到我的c程序中的全局變量中。即全局變量x的值爲21,y在我的c文件中的值爲3,而註釋被忽略。

我已經想了一會兒,不知道使用什麼函數。任何建議,將不勝感激,謝謝。 (請注意,這些變量將始終具有相同的名稱,但它們的顯示順序將不同於輸入文件和輸入文件)。

+0

我不認爲這是可能的。您不能在運行時確定具有特定名稱的新變量。 –

+0

Python通過將所有變量保留在字典中來實現這一點。 –

+0

變量*名稱*只存在於您的C源代碼中,而不存在於已編譯的可執行文件中。在某些情況下,甚至可以將變量*值*完全優化。 – usr2564301

回答

1

我建議你有兩個字段的結構。

struct Foo 
{ 
    char var_name; 
    int var_value; 
}; 

然後,您將創建一個這些結構的數組,其中包含輸入文件中預期變量的大小。

struct Foo input_array[n]; 

然後,當你閱讀您的文件,你設置的結構域...

for(int i = 0; i < n ; i++){ 
    input_array[i].var_name = input_var_name; 
    input_array[i].var_value = input_var_value; 
} 

之後,您打印的值,因爲它們已經在秩序。

+0

謝謝。讀取文件雖然 – user3186023

1

首先,我們需要的變量讀值到:

int x, y, z /* etc */; 

現在,讓我們做一個指針數組,這樣我們就可以很容易地訪問的變量:

int *array[] = { &x, &y, &z /* etc */ }; 

現在,我們需要一個FILE*訪問該文件:

FILE* fp; 

打開文件:

fp = fopen("filename.txt", "r"); /* 'r' for reading */ 

檢查如果文件成功打開:

if(fp == NULL) 
{ 
    printf("Error opening file"); 
    exit(-1); /* Exit the program */ 
} 

現在,閱讀使用fscanf文件:

int counter = 0; /* For keeping track of the array index */ 
for(;;) { /* Infinite loop */ 
    int retVal = fscanf(fp, "%d", array[counter]); /* Capture return value of fscanf */ 

    if(retVal == 1) /* Successfully scanned a number */ 
    { 
     counter++; 
    } 
    else if(retVal == 0) /* Failed to scan a number */ 
    { 
     fscanf(fp, "%*s"); /* Discard a word from the file */ 
    } 
    else /* EOF */ 
    { 
     break; /* Get out of the loop */ 
    } 
} 

現在,打印掃描的數據:

int i; 
for(i = 0; i < counter; i++) 
    printf("%d", *array[i]); 

最後,關閉文件:

fclose(fp); 

的完整代碼,添加@ Jongware的建議:

int x, y, z /* etc */; 
int *array[] = { &x, &y, &z /* etc */ }; 

char line[1024]; 
const char *varNames[] = { "x", "y", "z" }; 

int tmp = -1; 

FILE* fp; 
fp = fopen("filename.txt", "r"); /* 'r' for reading */ 

if(fp == NULL) 
{ 
    printf("Error opening file"); 
    exit(-1); /* Exit the program */ 
} 


int counter = 0; 
for(fgets(line, sizeof(line), stdin)) { 
    if(line[0] == '%') 
     continue; 
    else 
    { 
      tmp = -1; 

      for(int i = 0; i < sizeof(varNames)/sizeof(*varNames); i++) 
      { 
       if(strcmp(line, varNames[i]) == 0) 
       { 
        tmp = i; 
        break; 
       } 
      } 

      fgets(line, sizeof(line), stdin); 
      sscanf(line, "%d", array[tmp]); 
    } 
} 

int i; 
for(i = 0; i < counter; i++) 
    printf("%d", *array[i]); 

fclose(fp); 

所有上面的代碼是未經測試

+0

感謝您的問題。這是否將其保存到聲明的變量x,y?如果訂單在輸入文件中交換,該怎麼辦? – user3186023

+1

「_是否將它保存到聲明的變量x,y?_」是的。 「_如果訂單在輸入文件中被交換?_」 - 您似乎不明白程序的功能。它從文件中掃描* values *並按照'int * array [] = {&x,&y,&z/* etc * /};'給出的順序存儲它們。試試這個程序。當你嘗試它時你會明白更多。 –

+0

好的,謝謝。我會在家時檢查它 - 欣賞幫助。謝謝 – user3186023