从文件中获取字符后的整数

时间:2015-03-02 15:44:10

标签: c scanf

我正在尝试读取这样的txt文件的数量:

input=20
output=10
hidden=5
....

我尝试使用此代码:

char line[30];
char values[100][20];
int i = 0;
FILE *fp;

fp = fopen("myFile.txt", "r");

if(fp == NULL)
{
    printf("cannot open file\n");
    return 0;
}
while(fgets(line, sizeof(line), fp) != NULL)
{
     sscanf(line, "%[^=]", values[i])
        printf("%s\n", values[i]);

    i++;
}
fclose(fp);

但我只获得第一个单词,而不是=之后的数字。

我得到了

input
output
etc 

而不是

20
10
5
etc

我怎样才能获得数字?

2 个答案:

答案 0 :(得分:5)

这一行

sscanf(line, "%[^=]", values[i]);

表示“阅读=签到values[i]”的所有内容,但不包括此内容。

如果您对等号后的数字部分感兴趣,请按以下步骤更改通话:

sscanf(line, "%*[^=]=%19s", values[i]);

此格式行表示“读取并忽略(因为星号)所有内容,包括等号。然后读取长度最多为19个字符的字符串到values[i]”。

Demo.

答案 1 :(得分:1)

请勿使用sscanf(),重新声明values以存储整数,例如

int values[LARGE_CONSTANT_NUMBER];

并在fgets()之后使用strchr

char *number;

number = strchr(line, '=');
if (number == NULL)
    continue;
number   += 1;
values[i] = strtol(number, NULL, 10);

如果您愿意,也可以使用malloc()realloc()来使values数组动态化。

如果您愿意,请尝试

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

int main(void)
{
    char   line[100];
    int    values[100];
    int    i;
    FILE  *fp;
    size_t maxIntegers;

    fp = fopen("myFile.txt", "r");
    if (fp == NULL)
    {
        perror("cannot open file\n");
        return 0;
    }

    i           = 0;
    maxIntegers = sizeof(values) / sizeof(values[0]);
    while ((fgets(line, sizeof(line), fp) != NULL) && (i < maxIntegers))
    {
        char *number;

        number = strchr(line, '=');
        if (number == NULL) /* this line does not contain a `=' */
            continue;
        values[i++] = strtol(number + 1, NULL, 10);

        printf("%d\n", values[i - 1]);
    }
    fclose(fp);

    return 0;
}

使用这种技术可以避免将数字不必要地存储为字符串。