随机阅读文件

问题描述:

我需要读取一个随机排列的ASCII字符的文件,并根据我得到的任何字符做一些事情。我可以得到任何这些字符类型“/”,“*”,一个字符串或数字。我需要针对每种情况做一些不同的事情。我认为最好的方法是从fgets开始逐行阅读。之后,我通常会使用sscanf,但由于我将读取的文件有随机排列的ASCII字符,我不确定如何执行此操作。这是我开始的。任何想法将不胜感激。随机阅读文件

while(fgets(buffer, 80, fp) != NULL) 
{ 
    /*if(/) 
    { 
     //do something for "/" character 
    } 
    if(*) 
    { 
     //do something for "*" character 
    } 
    if(string) 
    { 
     //do something for string 
    } 
    if(numbers) 
    { 
     //do something for numbers 
    }*/ 
    memset(buffer, 0, 80); 
} 
+0

你可以尝试switch语句或查表法 –

+0

你应该遍历缓冲区的内容,并在每个迭代进行修改。我不太明白代码末尾的memset的用途。 – 2015-09-05 06:41:15

+1

您可以通过显示示例输入文件来改善问题。 – user3386109

例子是这样的:

while(fgets(buffer, 80, fp) != NULL) 
{ 
    char ch, cx = 0; 
    double n; 

    if(sscanf(buffer, "%c %c", &ch, &cx) == 1){ 
     if(ch == '/'){ 
      puts("/"); 
     } else if(ch == '*'){ 
      puts("*"); 
     } 
    } else if(sscanf(buffer, "%lf %c", &n, &cx) == 1){ 
     puts("number"); 
    } else {//Check further limiting condition? 
     puts("string"); 
    } 
    memset(buffer, 0, 80); 
} 

您正确的思维。任何这些类型问题的关键是将行读入缓冲区,就像你所做的那样。然后你必须理解缓冲区中的内容。通常,大部分决策都可以在缓冲区的第一个字符上进行(例如+,-,/,*,...)。

还有其他一些情况,你将需要进一步处理行,你已经通过后您的初始测试(例如isdigit(),或isalpha()(这可以减少到简单的字符比较,以避免函数调用)。

处理两者的简单方法是简单地指定一个指向缓冲区的指针,然后使用指针对缓冲区进行处理,以便测试,提取或传递所需的元素到您的处理函数。

现在下一个挑战是循环控制,有些测试我需要整个字符串,有些可能只关心第一个char。 ething像下面将让你处理任何行以优雅的方式来获得您所需要的信息:

while(fgets(buffer, 80, fp) != NULL) 
{ 
    char *p = buffer; 
    while (*p) 
    { 
     if(/) 
     { 
      //do something for "/" character 
     } 
     if(*) 
     { 
      //do something for "*" character 
     } 
     if(('A' <= *p && *p <= 'Z') || ('a' <= *p && *p <= 'z')) 
     { 
      // do something for string 
      // handle initial char 
      while (*p) { 
       // handle rest of string; 
       p++; 
      } 
      if (!*p) 
       goto nextline; 
     } 
     if('1' <= *p && '9' <= *p) 
     { 
      // do something for numbers 
      convert numbers with atoi() or strtol(), .... 
      if (endofline) 
       goto nextline; 
     } 
     p++; 
    } 
    nextline:; 
    //memset(buffer, 0, 80); /* not needed */ 
} 

有更加多样化,不同的方式来做到这一点比你能摆一只死猫。您可以选择适合您的数据的程序控制方法。如果您有任何问题,请告诉我。

+0

我知道我对指针的理解不如我想象的那么好。如果缓冲区以字符串开始,它将如何处理数字?它似乎没有办法处理数字后,它进入if语句的信件。那是对的吗? – rocker

+0

希望我会记得strtok。我觉得我比这更需要努力。 – rocker

+0

这是值得黄金的重量,特别是如果你把它包在一个for循环,例如, 'char * p; for(p = strtok(str,delim); p; p = strtok(NULL,delim))'。 –