C语言 如何只扫描我们想要的元素?

lc8prwob  于 2022-12-02  发布在  其他
关注(0)|答案(2)|浏览(103)

我想对一个.txt文件执行fscanf,下面是它的外观

7  6
[1,2]="english"
[1,4]="linear"
[2,4]="calculus"
[3,1]="pe"
[3,3]="Programming"

我只想取括号中的两个数字,第一个是day,第二个是session,我还想取字符串subject
下面是完整的代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(){
    FILE *inputFile, *outputFile;
    
    int day;
    int session;
    char subject[15];
    
    inputFile = fopen("Schedule.txt", "r");
        if (inputFile == NULL) {
            puts("File Schedule.txt Open Error.");
        }
    
    fscanf(inputFile, "%d %d %s", &day, &session, subject);
    
    printf("%d", day);
    
    fclose(inputFile);
    
    return 0;

}

显然Fscanf没有按照我希望的方式工作。
预期的输出是将数字存储到我已分配的变量中
实际上它只打印出了'7'

mbjcgjjk

mbjcgjjk1#

使用sscanf逐行阅读的方法

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define LINEBUFSIZE 500

int main(){
    FILE *inputFile;
    
    char line[LINEBUFSIZE];
    
    inputFile = fopen("Schedule.txt", "r");
    if (inputFile == NULL) {
        puts("File Schedule.txt Open Error.");
    }

    while (fgets(line, LINEBUFSIZE, inputFile)) {
        int day;
        int session;
        char subject[15];
        int r;
        // %14s because char subject[15] (14 char + null)
        r = sscanf(line, "[%d,%d]=%14s", &day, &session, subject);
        if (r != 3)
            // Could not read 3 elements
            continue;
        printf("%d %d %s\n", day, session, subject);
    }

    return 0;

}
fnx2tebb

fnx2tebb2#

只取括号中的两个数字,第一个是day,第二个是session,我还想取字符串subject
(我让OP处理第一行"7 6\n"。)
删除所有fscanf()调用。使用fgets()读取 * 行 *,然后进行分析。

char buf[100];
if (fgets(buf, sizeof buf, inputFile)) {
  // Parse input like <[1,2]="english"\n>
  int day;
  int session;
  char subject[15];
  int n = 0;
  sscanf(buf, " [%d ,%d ] = \"%14[^\"]\" %n",
    &day, &session, subject, &n);
  bool Success = n > 0 && buf[n] == '\0';
  ...

扫描字符串。如果完全成功,n将为非零值,并且buf[n]将指向字符串的末尾。
" "使用可选白色。
消耗一个。
"%d"使用可选空格,然后使用int的数字文本。
消耗一个。
消耗一个。
"\""使用双引号。
"%14[^\"]"使用1到14个非双引号字符,形成 * 字符串 *。
"%n"将扫描的偏移保存为int

相关问题