fscanf 到 int 和数组
fscanf to int and array
我正在接收一个文件作为 C 程序中的参数
每一行都有不同数量的整数,如下所示:
1 2 4 5 6
7 8 8 9 10 -1 2 3
12 3 4 -2 2 -3 9 2 4
我想将每行的前 2 个参数放入某个 int 中,将其余所有参数放入一个数组中,类似于第 2 行:
int a;
int b;
int c[10];
int a = 7;
int b = 8;
int c = [8,9,10,-1,1,2,3]
我能够获得前 2 个,但我无法为数组实现它。
如有任何帮助,我们将不胜感激
这是我现在拥有的:
//get line per line until \n
while (fscanf(fp, "%d %d", a, b) != EOF)
while (fscanf(fp,"%d [^\n]", c[n]) != EOF)
n++;
// print each line
for ( int k = 0 ; k < 10; k ++)
printf("%d %d %d \n", a, b, c[k]);
仅使用 fscanf
分隔行可能很棘手。您最好使用 fgets
读取一行,然后使用 sscanf
从那里读取数字。
此外,fscanf
和 sscanf
return 匹配的项目数。您不应该检查 EOF。
char line[300];
while (fgets(line, sizeof(line), fp)) {
int rval = sscanf(line, "%d %d", &a, &b);
if (rval == 2) {
int count = 0;
do {
rval = sscanf(line, "%d", &c[count++]);
} while (rval == 1);
}
}
阅读C read file line by line and How to extract numbers from string in c?,然后你会得到这样的结果:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void) {
FILE * fp;
char * line = NULL;
size_t len = 0;
ssize_t read;
fp = fopen("input.txt", "r");
if (fp == NULL)
return -1;
while ((read = getline(&line, &len, fp)) != -1) {
printf("Retrieved line of length %zu:\n", read);
//printf("%s", line);
char* p = line;
int a, b, c[10], counter = -2;
while (*p) { // While there are more characters to process...
if ( isdigit(*p) || ( (*p=='-'||*p=='+') && isdigit(*(p+1)) )) {
// Found a number
long val = strtol(p, &p, 10); // Read number
//printf("%ld\n", val); // and print it.
if(counter == -2)
a = val;
else if(counter == -1)
b = val;
else if(counter < 10)
c[counter] = val;
counter++;
} else {
// Otherwise, move on to the next character.
p++;
}
}
printf("a = %d, b = %d\n", a, b);
for(int i = 0; i < counter; ++i)
printf("%d ", c[i]);
printf("\n");
}
fclose(fp);
if (line)
free(line);
return 0;
}
输出:
Retrieved line of length 10:
a = 1, b = 2
4 5 6
Retrieved line of length 18:
a = 7, b = 8
8 9 10 -1 2 3
Retrieved line of length 21:
a = 12, b = 3
4 -2 2 -3 9 2 4
我正在接收一个文件作为 C 程序中的参数
每一行都有不同数量的整数,如下所示:
1 2 4 5 6
7 8 8 9 10 -1 2 3
12 3 4 -2 2 -3 9 2 4
我想将每行的前 2 个参数放入某个 int 中,将其余所有参数放入一个数组中,类似于第 2 行:
int a;
int b;
int c[10];
int a = 7;
int b = 8;
int c = [8,9,10,-1,1,2,3]
我能够获得前 2 个,但我无法为数组实现它。
如有任何帮助,我们将不胜感激
这是我现在拥有的:
//get line per line until \n
while (fscanf(fp, "%d %d", a, b) != EOF)
while (fscanf(fp,"%d [^\n]", c[n]) != EOF)
n++;
// print each line
for ( int k = 0 ; k < 10; k ++)
printf("%d %d %d \n", a, b, c[k]);
仅使用 fscanf
分隔行可能很棘手。您最好使用 fgets
读取一行,然后使用 sscanf
从那里读取数字。
此外,fscanf
和 sscanf
return 匹配的项目数。您不应该检查 EOF。
char line[300];
while (fgets(line, sizeof(line), fp)) {
int rval = sscanf(line, "%d %d", &a, &b);
if (rval == 2) {
int count = 0;
do {
rval = sscanf(line, "%d", &c[count++]);
} while (rval == 1);
}
}
阅读C read file line by line and How to extract numbers from string in c?,然后你会得到这样的结果:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void) {
FILE * fp;
char * line = NULL;
size_t len = 0;
ssize_t read;
fp = fopen("input.txt", "r");
if (fp == NULL)
return -1;
while ((read = getline(&line, &len, fp)) != -1) {
printf("Retrieved line of length %zu:\n", read);
//printf("%s", line);
char* p = line;
int a, b, c[10], counter = -2;
while (*p) { // While there are more characters to process...
if ( isdigit(*p) || ( (*p=='-'||*p=='+') && isdigit(*(p+1)) )) {
// Found a number
long val = strtol(p, &p, 10); // Read number
//printf("%ld\n", val); // and print it.
if(counter == -2)
a = val;
else if(counter == -1)
b = val;
else if(counter < 10)
c[counter] = val;
counter++;
} else {
// Otherwise, move on to the next character.
p++;
}
}
printf("a = %d, b = %d\n", a, b);
for(int i = 0; i < counter; ++i)
printf("%d ", c[i]);
printf("\n");
}
fclose(fp);
if (line)
free(line);
return 0;
}
输出:
Retrieved line of length 10:
a = 1, b = 2
4 5 6
Retrieved line of length 18:
a = 7, b = 8
8 9 10 -1 2 3
Retrieved line of length 21:
a = 12, b = 3
4 -2 2 -3 9 2 4