2013-01-16 23 views
0

我想讀取一個文件,找到字符串「myprop」,並在「myprop」後面會出現一個「=」號然後是一個數字。我需要將這個數字打印成一個字符串,擺脫空白和評論。我能找到「myprop」字符串,然後我相信我應該使用fscanf,但我遇到了麻煩。如何打印特定字符串後的值

const char *get_filename_property() 
{ 
    const char *filename = "myfile.properties"; 
    const char *propkey = "myprop"; 
    char buffer[100], *buffPtr, lastChar, value[50]; 
    int line_num=1, i=0; 

    FILE *fp; 
    fp=fopen("myfile.properties", "r"); 
    if (fp == NULL) 
     perror("Error opening file\n\n"); 

    while(fgets(buffer, 100, fp) != NULL) 
    { 
     if((strstr(buffer, propkey)) != NULL) 
     { 
      printf("Myprop found on line: %d\n", line_num); 
      printf("\n%s\n", buffer); 
     } 
     line_num++; 
    } 
    if (fp) 
     fclose(fp); 
} 

int main(int argc, char *argv[]) 
{ 
    get_filename_property(); 
    system("pause"); 
    return(0); 
}  
+0

如果什麼添加它位於第一裝載緩衝和它的其餘部分位於第二加載propkey'的'某些部分緩衝?在這種情況下,您無法在文件中找到「propkey」。 – deepmax

+0

您是否需要在程序的任何位置實際使用該值,還是隻是將其打印出來?如果你所需要做的只是打印它,我不會費心轉換 - 只需找到'='符號(使用'strstr()'的返回值和''myprop''的已知長度來計算到哪裏開始掃描),然後直接複製後面的字符進行輸出,直到您點擊行或空格的末尾或另一個不屬於該值的字符。如果你需要這個值,而不是'sscanf()',找到這個值的開始,並使用合適的'strto?()'函數進行轉換。 – twalberg

+1

除了隨機值位於主CPU寄存器之外,您可能還想考慮從'get_filename_property()'返回一些東西。 – WhozCraig

回答

1

當你發現文件中mypop字符串可以在瞬間補充sscanf。添加下面一行在你的while循環:

sscanf(buf,"%*[^=]= %[^\n]",value); 

"%*[^=]":這意味着,scanf函數capte以前生產=所有字符,而忽略它

" %[^\n]":這意味着你的=直到後capting所有字符緩衝區字符串的末尾(即使是空格字符)。只有在值字符串的beggining的空格字符不會capted

這樣

while(fgets(buffer, 100, fp) != NULL) 
{ 
    if((strstr(buffer, propkey)) != NULL) 
    { 
    printf("Myprop found on line: %d\n", line_num); 
    printf("\n%s\n", buffer); 
    sscanf(buf,"%*[^=]= %[^\n]",value); 
    printf("\nvalue is %s\n", value); 
    break; 
    } 
    line_num++; 
} 
+1

你的示例代碼不應該將'buffer'傳遞給調用'sscanf'嗎? – simonc

+0

是的,我更新了代碼,謝謝 – MOHAMED

+0

真棒這個作品,謝謝。還有一個問題,我怎麼不打印評論?如果propkey所在的行表示myprop = 1 //值,那麼我怎樣才能擺脫反斜槓及其後的所有內容 – user1984300