使用fscanf多值在C中读取

使用fscanf多值在C中读取,c,scanf,C,Scanf,从以下格式的文本文件: Name Surname ID Address Name Surname ID Address Name Surname ID Address 我需要提取每个变量并将其放入变量中 我尝试了以下两种方法: while(fscanf(fp, "%s,%s,%d,%s\n", name2,surname2,&id2,address2) != EOF){ printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",

从以下格式的文本文件:

Name Surname ID Address
Name Surname ID Address
Name Surname ID Address
我需要提取每个变量并将其放入变量中

我尝试了以下两种方法:

while(fscanf(fp, "%s,%s,%d,%s\n", name2,surname2,&id2,address2) != EOF){
    printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
        &name2, &surname2, &id2, &address2);
}
这给了我错误的结果,每行只读一个单词,所以结果是这样的:

Name: Name Surname:@,a ID:2272012 Address: ?" Name: Surname Surname:@,a ID:2272012 Address: ?" Name: ID Surname:@,a ID:2272012 Address: ?" Name: Address Surname:@,a ID:2272012 Address: ?" 它什么也没读,什么也没发生

我从中读取的文件是.dat,用于分配任务,因此只能使用.dat。

  • 除非数据中有逗号,否则格式字符串中不应该有逗号,而数据中没有逗号
  • 如果任何字段包含空格,这将不起作用,因为
    %s
    将停止
  • 您需要显示更多的input.dat文件
  • 通常最好使用
    fgets()
    阅读整行内容,然后再考虑对其进行解析
      • 除非数据中有逗号,否则格式字符串中不应该有逗号,而数据中没有逗号
      • 如果任何字段包含空格,这将不起作用,因为
        %s
        将停止
      • 您需要显示更多的input.dat文件
      • 通常最好使用
        fgets()
        阅读整行内容,然后再考虑对其进行解析

      首先,从
      printf

      printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
              name2, surname2, id2, address2);
      
      如果输入txt文件中的separater-between字段是逗号

      Name,Surname , ID ,Address
      Name ,Surname,ID,Address
      Name,Surname,ID,Address
      
      然后在
      fscanf

      while(fscanf(fp, " %[^, ] , %[^, ] , %d , %[^\n]", name2,surname2,&id2,address2) != EOF){
          printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
              name2, surname2, id2, address2);
      }
      
      while(fscanf(fp, " %s %s %d %[^\n]", name2,surname2,&id2,address2) != EOF){
          printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
              name2, surname2, id2, address2);
      }
      
      如果输入txt文件中字段之间的分隔符为空格

      Name Surname ID Address
      Name Surname ID Address
      Name Surname ID Address
      
      然后在
      fscanf

      while(fscanf(fp, " %[^, ] , %[^, ] , %d , %[^\n]", name2,surname2,&id2,address2) != EOF){
          printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
              name2, surname2, id2, address2);
      }
      
      while(fscanf(fp, " %s %s %d %[^\n]", name2,surname2,&id2,address2) != EOF){
          printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
              name2, surname2, id2, address2);
      }
      

      首先,从
      printf

      printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
              name2, surname2, id2, address2);
      
      如果输入txt文件中的separater-between字段是逗号

      Name,Surname , ID ,Address
      Name ,Surname,ID,Address
      Name,Surname,ID,Address
      
      然后在
      fscanf

      while(fscanf(fp, " %[^, ] , %[^, ] , %d , %[^\n]", name2,surname2,&id2,address2) != EOF){
          printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
              name2, surname2, id2, address2);
      }
      
      while(fscanf(fp, " %s %s %d %[^\n]", name2,surname2,&id2,address2) != EOF){
          printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
              name2, surname2, id2, address2);
      }
      
      如果输入txt文件中字段之间的分隔符为空格

      Name Surname ID Address
      Name Surname ID Address
      Name Surname ID Address
      
      然后在
      fscanf

      while(fscanf(fp, " %[^, ] , %[^, ] , %d , %[^\n]", name2,surname2,&id2,address2) != EOF){
          printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
              name2, surname2, id2, address2);
      }
      
      while(fscanf(fp, " %s %s %d %[^\n]", name2,surname2,&id2,address2) != EOF){
          printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
              name2, surname2, id2, address2);
      }
      
      我认为这就是错误所在:

      应该是:

      while(fscanf(fp, "%s,%s,%d,%s\n", name2,surname2,&id2,address2) != EOF){
          printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
              name2, surname2, id2, address2);
      }
      
      我认为这就是错误所在:

      应该是:

      while(fscanf(fp, "%s,%s,%d,%s\n", name2,surname2,&id2,address2) != EOF){
          printf("Name: %s, Surname: %s, ID: %d, Address: %s\n",
              name2, surname2, id2, address2);
      }
      

      您声明文本文件的格式为:

      string<space>string<space>numeric<space>string<newline>
      
      这假设每个
      字符串
      字段是一个ASCII值块,没有空格/制表符等。您的代码缺少变量的定义方式,可能类似于:

      char name2[100] = {0};
      char surname2[100] = {0};
      int id2 = 0;
      char address2[100] = {0};
      
      在这种情况下,您不需要在
      fscanf
      字符串中的这些名称之前加上
      &
      。因此,给定一个输入文件:

      第一大街1234号somebody@something.com
      第22352节goo@gle.com
      哈哈,9999nice@lly.com

      以及上述变量声明,代码如下:

      FILE * fp;
      fp = fopen("test.txt", "r");
      while(fscanf(fp, "%s %s %d %s\n", name2, surname2, &id2, address2) == 4) 
          printf("name: %s %s, id: %d, address %s\n", name2, surname2, id2, address2);
      
      fclose(fp);
      

      正确读取/显示值。

      您声明文本文件的格式为:

      string<space>string<space>numeric<space>string<newline>
      
      这假设每个
      字符串
      字段是一个ASCII值块,没有空格/制表符等。您的代码缺少变量的定义方式,可能类似于:

      char name2[100] = {0};
      char surname2[100] = {0};
      int id2 = 0;
      char address2[100] = {0};
      
      在这种情况下,您不需要在
      fscanf
      字符串中的这些名称之前加上
      &
      。因此,给定一个输入文件:

      第一大街1234号somebody@something.com
      第22352节goo@gle.com
      哈哈,9999nice@lly.com

      以及上述变量声明,代码如下:

      FILE * fp;
      fp = fopen("test.txt", "r");
      while(fscanf(fp, "%s %s %d %s\n", name2, surname2, &id2, address2) == 4) 
          printf("name: %s %s, id: %d, address %s\n", name2, surname2, id2, address2);
      
      fclose(fp);
      

      正确读取/显示值。

      我们可以查看输入数据文件的内容吗?请注意,使用字符串说明符而不使用宽度说明符并不安全,这几乎就像
      获取
      。输入文件中的字段之间没有逗号?由于您使用逗号
      作为
      scanf
      中字段之间的分隔符,我们可以查看输入数据文件的内容吗?请注意,使用字符串说明符而不使用宽度说明符并不安全,这几乎就像
      获取
      。输入文件中的字段之间没有逗号?因为您使用逗号
      作为
      scanf