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

huus2vyu  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(144)

目前,我使用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)

jjhzyzn0

jjhzyzn01#

继续我的评论,您可以使用fgets()读取line,然后使用sscanf()和格式字符串" %c%d%n"提取第一个字符,并将下一组数字转换为int,最后使用"%n"说明符获得sscanf()在该转换中使用的字符总数。您验证字符和整数转换都已发生,并且读取的第一个非空白字符是'T'。然后,您可以根据需要使用mycharmyint,并使用mylen作为要与send一起使用的长度。
(**注意:**您可以在line中向前扫描,以确定开头是否包含任何空格,并在对send()的调用中忽略than--这是留给您的)
总而言之,你可以这样想:

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 */
  }

更具体地说,我需要查看您的Minimal Complete Reproducible Example,以确保除了您发布的内容之外,没有任何内容会影响上面的代码。

添加示例

添加一个简短的示例来显示在预期和非预期输入下的解析结果,并添加向前扫描以删除行中的前导空格,这是一个从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

如果您有任何问题,或者我误解了您问题的某个方面,请告诉我。

相关问题