2013-01-16 20 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