C语言 从不同行大小的输入文件中读取行



目前,我使用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: %sn", line);
buffer[0] = line[1]; // this is a single digit number in char form
buffer[1] = '';
// send buffer somewhere
send(clientSocket, buffer, strlen(buffer), 0);
// ...
}

示例文件如下:

T3
T9
S0
S4
T55
T6

然而,正如你所看到的,当一个数字>9是给出的,比如这里的T55线。我只能用这种方法获取第一个数字。因此,我可能不得不完全重做读取文件的方式。是否有一个更好的和简单的方法,我可以通过读取输入文件,检查第一个字符,并使剩余的字符(s)成int,直到一行结束?(最大值为100btw)

继续我的评论,您可以使用fgets()读取line,然后使用sscanf()" %c%d%n"的格式字符串提取第一个字符并将下一组数字转换为int,最后使用"%n"说明符获得sscanf()在该转换中消耗的字符总数。您验证了字符和整数转换都发生了,并且读取的第一个非空白字符是'T'。然后,您可以根据需要使用mycharmyint,并使用mylen作为与send一起使用的长度。

(注意:您可以在line中向前扫描,以确定是否在开始处包含任何空白,并忽略对send()的调用(这是留给您的)

把它们放在一起,你可以这样写:

char line[1024],
mychar = 0;
int myint = 0,
mylen;

/* read using fgets */
while (fgets (line, sizeof line, stdin)) {
/* parse with sscanf, validate both conversions and 'T' as 1st char,
* use "%n" to get number of chars through int conversion
*/
if (sscanf (line, " %c%d%n", &mychar, &myint, &mylen) != 2 || 
mychar != 'T') {
fputs ("error: invalid format.n", stderr);
continue;
}

send (clientSocket, line, mylen, 0);    /* send mylen chars */
}

更具体地说,我需要看到你的最小完整可复制示例,以确保在你发布的内容之外没有任何东西会影响上面的代码。


添加示例

添加一个简短的示例来显示在预期和非预期输入下解析的结果,并添加向前扫描以删除行中的前导空格,一个从stdin读取输入并写入stdout的简短程序,输出与'T'(int)匹配的行,您可以这样做:

#include <stdio.h>
#include <unistd.h>
#include <ctype.h>
int main (void) {
char line[1024],
mychar = 0,
nl = 'n';
int myint = 0,
mylen;

/* read using fgets */
while (fgets (line, sizeof line, stdin)) {
char *p = line;
/* parse with sscanf, validate both conversions and 'T' as 1st char,
* use "%n" to get number of chars through int conversion
*/
if (sscanf (line, " %c%d%n", &mychar, &myint, &mylen) != 2 || 
mychar != 'T') {
fprintf (stderr, "error: invalid format: %s", line);
continue;
}

while (isspace (*p)) {    /* reamove leading whitespace */
p += 1;
mylen -= 1;
}

// send (clientSocket, p, mylen, 0);    /* send mylen chars */
write (STDOUT_FILENO, p, mylen);
write (STDOUT_FILENO, &nl, 1);
}
}

(注意:上面包含的write (STDOUT_FILENO, &nl, 1);只是为了在每个输出之后输出一个换行符——它不会是套接字上send()的一部分——除非接收程序使用'n'作为行终止字符)

输入文件示例:

$ cat dat/charint.txt
T4
T44
T444
TT
T3 and more gibberish
P55

(注意:'T'开头的最后两行包含的前导空格和尾随字符,包括无效的行格式" TT")

使用/输出示例

$ ./bin/charandintsend < dat/charint.txt
T4
T44
T444
error: invalid format:  TT
T3
error: invalid format: P55

如果你有问题,或者如果我误解了你问题的某些方面,请告诉我。

相关内容

  • 没有找到相关文章

最新更新