从文件中读取特定行的C程序
我正在尝试制作一个程序,该程序将对文件中的行进行计数,并将特定行作为另一个计数引用(即以#开头的行不应计数) 现在我做错了什么从文件中读取特定行的C程序,c,file,C,File,我正在尝试制作一个程序,该程序将对文件中的行进行计数,并将特定行作为另一个计数引用(即以#开头的行不应计数) 现在我做错了什么 我还注意到,第一次调用fgets时,我得到了∩作为tempstring[0]的输出,这是为什么?您的条件始终为真-您想使用&&,或者否定整个|: if (tempstring[0] != '#' && tempstring[0]!='\n' && tempstring[0]!=' ') 或 这是等效的。请注意,如果,您可以同时删除,因为
我还注意到,第一次调用fgets时,我得到了
∩
作为tempstring[0]
的输出,这是为什么?您的条件始终为真-您想使用&&
,或者否定整个|
:
if (tempstring[0] != '#' && tempstring[0]!='\n' && tempstring[0]!=' ')
或
这是等效的。请注意,如果,您可以同时删除,因为C中的true
与1
相同:
count += (tempstring[0] != '#' && tempstring[0]!='\n' && tempstring[0]!=' ');
还要注意,fgets
可能会也可能不会给出行的开头,这取决于sizeof(tempstring)
。如果tempstring
的长度不足以容纳文件中的整个字符串,则您的调用可能会从另一个字符串的中间生成一个字符串,从而导致错误行为。这更难修复,因为现在您需要一个循环来检查从fgets
返回的字符串的最后一个字符是否为'\n'
您的条件始终为真-您想要使用&
,或者否定整个|
:
if (tempstring[0] != '#' && tempstring[0]!='\n' && tempstring[0]!=' ')
或
这是等效的。请注意,如果
,您可以同时删除,因为C中的true
与1
相同:
count += (tempstring[0] != '#' && tempstring[0]!='\n' && tempstring[0]!=' ');
还要注意,fgets
可能会也可能不会给出行的开头,这取决于sizeof(tempstring)
。如果tempstring
的长度不足以容纳文件中的整个字符串,则您的调用可能会从另一个字符串的中间生成一个字符串,从而导致错误行为。这更难修复,因为现在需要一个循环来检查从fgets
返回的字符串的最后一个字符是否为'\n'
tempstring[0]!='#'|tempstring[0]!='\n'| | tempstring[0]!=''
总是正确的。请注意,fgets
可能看不到完整的一行。这就是为什么首先在纸上计划代码是有帮助的,尤其是当你是新手时。请养成这样做的习惯。随着时间的推移,你会变得更好,并且能够在你的头脑中做到这一点,但尝试从头开始编写代码就像尝试驾驶一架没有使用操纵杆经验的战斗机一样。您可以从现在的位置开始从头开始编写代码,但您需要练习这些技能,如果不练习,您将陷入困境。tempstring[0]!='#'|tempstring[0]!='\n'| | tempstring[0]!=''
总是正确的。请注意,fgets
可能看不到完整的一行。这就是为什么首先在纸上计划代码是有帮助的,尤其是当你是新手时。请养成这样做的习惯。随着时间的推移,你会变得更好,并且能够在你的头脑中做到这一点,但尝试从头开始编写代码就像尝试驾驶一架没有使用操纵杆经验的战斗机一样。您可以从现在的位置开始从头开始编写代码,但您需要练习这些技能,如果不练习,您将陷入困境。如果文件在最后一行末尾没有POSIX“\n”
,您还可以有一个额外的警告。在这种情况下,您需要在每次读取时设置一个标志(例如int feol=0;
,并在验证每行结束时设置feol=1;
。退出读取循环后,您需要检查tempstring&&!feol
,并处理最后一行输入(将计数增加1
)如果字符测试通过。如果文件在最后一行末尾没有POSIX'\n'
,您可以有一个额外的警告。在这种情况下,您需要设置一个标志(例如,每次读取时int feol=0;
,并在验证每行结束时设置feol=1;
。退出读取循环后,如果字符测试通过,则需要检查是否tempstring&&!feol
,并处理最后一行输入(将计数增加1
)。