c - fscanf 在行中间找到空白字段后无法正常工作

标签 c linux embedded scanf fopen

我正在尝试循环读取文件的每一行并将值存储在结构中。 当 fscanf 遇到一个空字符串时,它会读取所有内容直到行尾,并且该行中的其他字段被读取为零。有没有办法指定 fscanf 将空间读取为字段。 下面的例子,

文件.db:

tick31486081-tick31486081.mtd ,00:00:00:00:01:0e-31486081 , ,0,0,245
tick31486096-tick31486107-video1.ts ,00:00:00:00:01:0e-31486081 , ,1155072,5005312,5005312
tick31486080-tick31486080.mtd ,00:00:00:00:01:0e-31486080 , ,0,0,271

读取数据后:

tick31486081-tick31486081.mtd ,       00:00:00:00:01:0e-31486081 ,                      **,0,0,245** ,0,0,0
tick31486096-tick31486107-video1.ts ,       00:00:00:00:01:0e-31486081 ,      **,1155072,5005312,5005312** ,0,0,0
tick31486080-tick31486080.mtd ,       00:00:00:00:01:0e-31486080 ,                      **,0,0,271** ,0,0,0

有没有一种方法可以处理这个问题而不忽略读取字段的空间?

FILE *fp = fopen (FILE, "r");
if (fp)
{
    int retval;
    int numRead = 0;
    while (numRead != EOF)
    {
        Node_t *node = calloc (1, sizeof(Node_t));
        if (node)
        {

            numRead = fscanf (fp, "%40s ,%30s ,%33s ,%d,%d,%d\n", 
                    node->name, node->reid, node->hash,
                    &node->startOffset, &node->stopOffset, &node->length);
            printf(" %s ,%s ,%s ,%d,%d,%d", 
                    node->name, node->reid, node->hash,
                    node->startOffset, node->stopOffset, node->length);

        }

    }

    retval = fclose (fp);

}

最佳答案

将 "%[^,],%[^,],%[^,],%d,%d,%d\n"用于格式说明符,这将从前 3 个字符串值中删除逗号分隔符。

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

int main()
{
    char name[250], name2[250], name3[250];
    int one, two, three;
    FILE *f;
    f = fopen("text.txt", "r");
    if(f) {
        int numRead = 0;
        while (numRead != EOF) {
            numRead = fscanf(f, "%[^,],%[^,],%[^,],%d,%d,%d\n", name, name2, name3, &one, &two, &three);
            printf("name:%s name2:%s name3:%s one:%d two:%d three:%d\n", name, name2, name3, one, two, three);
            printf("name:%d name2:%d name3:%d\n", (int) strlen(name), (int) strlen(name2), (int) strlen(name3));
        }

        fclose(f);
    }
    else {
        printf("failed to open file\n");
    }

    return 0;
}

我认为您也可以用空格替换 fscanf-format-specifier 中的\n。

祝你好运!

关于c - fscanf 在行中间找到空白字段后无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49056107/

相关文章:

linux - 如何检测文件是 XLS 还是 XLSX

c - RAM 使用 AT32UC3B0512

linux - Busybox 与 Embutils

c++ - 绘图圆,OpenGL 风格

c - 更新源代码时未构建 Makefile

c - C中的十进制转二进制算法

python - 通过 TCP Socket 的单向通信

c++ - C 中的结构声明中的冒号是什么意思?

c++ - -O3(优化级别 3)有什么问题?

php - Apache2 没有获得正确的路径