我需要读取一个随机排列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 :(得分:0)
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);
}
答案 1 :(得分:0)
你正在思考。任何这些类型问题的关键是将行读入缓冲区,就像您所做的那样。然后你必须弄清楚缓冲区中的内容。通常,大多数决策可以在缓冲区中的第一个字符上进行(例如+,-,/,*,...
)。
在其他情况下,您需要在通过初始测试后进一步处理该行(例如isdigit()
或isalpha()
(可以简化为简单的字符比较以避免此功能呼叫)。
处理这两者的简单方法是简单地指定一个指向缓冲区的指针,然后使用指针测试,提取或传递所需的元素到处理函数。
现在接下来的挑战是循环控制。有些测试我需要整个字符串,有些可能只关心第一个char
。如下所示的方法将允许您以优雅的方式处理任何行以获取所需的信息:
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 */
}
有更多不同的方式可以做到这一点,而不是你可以摆动死猫。您可以选择适合您数据的程序控制方法。如果您有疑问,请告诉我。