这格式是什么%20 [^ \ n]?

时间:2018-02-01 06:00:35

标签: c scanf

有人能用C语言向我解释这种格式吗?

 with open('NoBench.csv') as csvfile :    
    readCSV = csv.reader(csvfile, delimiter=',')
    n=0
    for row in readCSV :
        if n == 0 :
            n+=1
        try:
            visuals[0].append([float(row[3]),float(row[5]),float(row[7]),float(row[9]),float(row[11]),float(row[13]),float(row[15]),float(row[17]),float(row[19]),float(row[21]),float(row[23]),float(row[25]),float(row[27]),float(row[29]),float(row[31]),float(row[33]),float(row[35]),float(row[37]),float(row[39]),float(row[41]),float(row[43])])
            visuals[1].append([float(row[2]),float(row[4]),float(row[6]),float(row[8]),float(row[10]),float(row[12]),float(row[14]),float(row[16]),float(row[18]),float(row[20]),float(row[22]),float(row[24]),float(row[26]),float(row[28]),float(row[30]),float(row[32]),float(row[34]),float(row[36]),float(row[38]),float(row[40]),float(row[42])])
        except ValueError:
           continue

我不明白fscanf(file_name,"%20[^\n]%*20c%ld%*c%d%*16c",name,&idE,&cod); 的含义。

1 个答案:

答案 0 :(得分:4)

如评论中所述,%20[^\n]扫描集转换规范意味着代码将读取不超过20个不是换行符的字符,null终止字符串(必要时使用第21个字节)。扫描集转换在]处完成 - 当您需要在扫描集中包含]时,有一些特殊规则。有关详细信息,请参阅POSIX scanf()手册。

请注意,有各种情况。首先,扫描集不会跳过前导空格(加%c%n是唯一不会跳过空格的三种转换规范。)

假设下一个字符是换行符:转换失败,因为必须至少有一个匹配它的字符才能成功。

假设接下来的几个字符不是换行符,但在读取20个字符之前有一个换行符。这些字符将被读入字符串,该字符串将以空值终止。

或者,假设接下来的几个字符不是换行符,但在第20个字符后面有一个换行符(立即)。字符串中将有20个字符被读取,加上一个空终止符,换行符将由格式字符串的下一部分处理。在问题中,那是%*20c,这意味着“读取20个字符,包括空格,但不分配给任何变量”。如果字符为%*20c而不是c,则c的匹配将失败;下一个字符是换行符。你知道因为scanf()只返回1而不是2或更多。

另一种选择是有超过20个非换行要阅读;其中20个将保存到与扫描集关联的变量中,以下字符将与格式字符串中的后续字符或转换规范匹配(或不匹配)。