随机阅读文件
问题描述:
我需要读取一个随机排列的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);
}
答
例子是这样的:
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 */
}
有更加多样化,不同的方式来做到这一点比你能摆一只死猫。您可以选择适合您的数据的程序控制方法。如果您有任何问题,请告诉我。
你可以尝试switch语句或查表法 –
你应该遍历缓冲区的内容,并在每个迭代进行修改。我不太明白代码末尾的memset的用途。 – 2015-09-05 06:41:15
您可以通过显示示例输入文件来改善问题。 – user3386109