我正在尝试读取这样的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
我怎样才能获得数字?
答案 0 :(得分:5)
这一行
sscanf(line, "%[^=]", values[i]);
表示“阅读=
签到values[i]
”的所有内容,但不包括此内容。
如果您对等号后的数字部分感兴趣,请按以下步骤更改通话:
sscanf(line, "%*[^=]=%19s", values[i]);
此格式行表示“读取并忽略(因为星号)所有内容,包括等号。然后读取长度最多为19个字符的字符串到values[i]
”。
答案 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;
}
使用这种技术可以避免将数字不必要地存储为字符串。