【问题标题】:Specifying a format for fscanf that doesn't contain white-spaces为 fscanf 指定不包含空格的格式
【发布时间】:2019-03-31 17:00:21
【问题描述】:

我正在尝试使用 fscanf() 从 c 中的文本文件中读取名称。但是,此文件中的名称不使用空格分隔。我还能用这个函数把每个名字分开吗?

目前,该文件包含以下文本:

"MARY","PATRICIA"

当我运行以下代码时:

FILE *nameFile;
char name1[100];
char name2[100];

nameFile = fopen("names.txt","r");

fscanf(nameFile, "%s,%s", name1, name2);
printf("name 1 : %s\n name 2 :%s\n", name1, name2);

fclose(nameFile);

我得到以下输出:

name1: "MARY","PATRICIA"
name2:

有什么方法可以在文件中不包含空格的情况下将名称分开?

【问题讨论】:

标签: c scanf


【解决方案1】:

您必须指示 fscanf() 寻找另一个分隔符,剪切字段(使用 %[ 格式化程序)。

请试试这个:

#include <stdio.h>

int main(int argc, char *argv[])
{
   FILE *nameFile;
   char name1[100];
   char name2[100];

   nameFile = fopen("names.txt","r");
   fscanf(nameFile, "%[^,],%[^,]\n", name1, name2);
   /* or fscanf(nameFile, "%[^,],%s\n", name1, name2); for second string */

   printf("name 1 : %s\n name 2 :%s\n", name1, name2);

   fclose(nameFile);

   return(0);
}

【讨论】:

  • 3 个弱点:1) 没有像 "%99[^,],%99[^,]\n" 这样的宽度限制 2) 代码不检查 fscanf() 的返回值。 3)"\n"可以多行读取。
  • 另一个缺点:%[^,], 无法处理 CSV 文件中常见的空字段。
  • 请注意trailing white space in a scanf() format string is evil 如果输入将来自用户而不是文件。从文件中通常可以,但最好避免尾随空格(在格式字符串的开头跳过带有空格的前导空格)。
  • 这是对有关 fscanf() 的特定问题的回答,而不是“项目请求”。我个人不喜欢 fscanf(),我不会使用 fscanf()。您对我的最佳回答在哪里投票??
猜你喜欢
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 2019-11-20
  • 2013-07-08
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多