【问题标题】:Using fscanf for reading formatted string from file使用 fscanf 从文件中读取格式化字符串
【发布时间】:2015-08-04 09:55:28
【问题描述】:

我有一个文件,其内容如下所示。

[John][Antony][Mathew] Australia

我需要使用fscanf 从文件中读取内容。

输出应该是:

firstName = John
middleName = Antony
lastName = Mathew
Country = Australia

fscanf 中使用什么格式来分别获取 firstName、middleName、lastName 和 country?

目前fscanf(fp, "[%[^]]",firstName) 正确给出了名字。

【问题讨论】:

  • "[%[^]]][%[^]]][%[^]]] %[^\n]%*c" , %(缓冲区大小 -1)[...]

标签: c file scanf


【解决方案1】:

类似于@BLUEPIXY 评论"[%[^]]][%[^]]][%[^]]] %[^\n]%*c"

由于数据肯定是每行,所以先读取一个,然后再解析它。

所需的格式是 "[%99[^]]]",它表示 1) 扫描 '[' 2) 扫描最多 99 个非] 字符并形成一个字符串 3) 扫描 ']'

#define N 100
#define FMT "[%99[^]]]" 
#define FMTCTY " %99[^\n]" 
char firstName[N], middleName[N], lastName[N], Country[N];

char buf[4*N + 10];
while (fgets(buf, sizeof buf, fp) != NULL) {
  if (4 != sscanf(buf, FMT FMT FMT FMTCTY, firstName, middleName, lastName, Country)) {
    break;
  }
  foo(firstName, middleName, lastName, Country);
}

自信的OP可以形成需要的输出格式字符串。

【讨论】:

    【解决方案2】:
    char buf[1024];
    
    FILE* fp = fopen("file.in", "r");
    fgets(buf, sizeof(buf), fp);
    fclose(fp);
    
    // substitute '[' and ']' with a space
    
    sscanf(buf, "%s%s%s%s", firstName, middleName, lastName, Country);
    

    也可以通过读取字符流并跨越所有空格'['和']'来完成。

    【讨论】:

    • "%s" 将无法将“新西兰”读入Country,因为遇到空格时扫描会停止。
    猜你喜欢
    • 2017-05-03
    • 2014-02-10
    • 1970-01-01
    • 2023-03-17
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多