目前,我使用getline从文件中读取行,并且可以通过以下方式从stdin访问单个字符:
char buffer[1024];
while((lineSize = getline(&line, &len, stdin)) != -1) {
if (line[0] != 84) {
// ...
continue; // continue to next line in file
}
if (line[0] == 84){ // (the 'T' character)
printf("TEST: Line Value: %s\n", line);
buffer[0] = line[1]; // this is a single digit number in char form
buffer[1] = '\0';
// send buffer somewhere
send(clientSocket, buffer, strlen(buffer), 0);
// ...
}
示例文件如下:
T3
T9
S0
S4
T55
T6
但是,正如您所看到的,当给定一个大于9的数字时,比如这里的T55行,我遇到了问题。我只能用这种方法获取第一个数字。因此,我可能不得不完全重做我读取文件的方式。有没有更好的和简单的方法,我可以通过一个输入文件读取,并检查第一个字符,使其余字符(s)转换为int直到一行结束?(最大整数可以是100btw)
1条答案
按热度按时间jjhzyzn01#
继续我的评论,您可以使用
fgets()
读取line
,然后使用sscanf()
和格式字符串" %c%d%n"
提取第一个字符,并将下一组数字转换为int
,最后使用"%n"
说明符获得sscanf()
在该转换中使用的字符总数。您验证字符和整数转换都已发生,并且读取的第一个非空白字符是'T'
。然后,您可以根据需要使用mychar
和myint
,并使用mylen
作为要与send
一起使用的长度。(**注意:**您可以在
line
中向前扫描,以确定开头是否包含任何空格,并在对send()
的调用中忽略than--这是留给您的)总而言之,你可以这样想:
更具体地说,我需要查看您的Minimal Complete Reproducible Example,以确保除了您发布的内容之外,没有任何内容会影响上面的代码。
添加示例
添加一个简短的示例来显示在预期和非预期输入下的解析结果,并添加向前扫描以删除行中的前导空格,这是一个从
stdin
读取输入并写入stdout
的简短程序,输出与'T'(int)
匹配的行,您可以执行以下操作:(注意:
write (STDOUT_FILENO, &nl, 1);
仅用于在每次输出后输出一个换行符--它不是套接字上send()
的一部分--除非接收程序使用'\n'
作为行终止字符)输入文件示例:
(**注意:**以
'T'
开头的最后两行中包含前导空格和尾随字符,包括无效的行格式" TT"
)使用/输出示例
如果您有任何问题,或者我误解了您问题的某个方面,请告诉我。