我正在尝试从.csr文件(不是完全.csr,而是基于.csr格式)读取矩阵。第一行包含矩阵的尺寸(x,y)。接下来的行具有未知数量的浮点数,下面的两行具有读取每个浮点数所在的列和行。
我以为我可以使用fgets从文件中读取该行,以获取将要读取数组的整个行,然后对由fgets复制的字符串使用sscanf。问题是,sscanf不会一一读取字符串中的整数。它会多次读取字符串的第一个int。
这是我目前编写的代码:
int * readLineOfInts(FILE * file) {
if (!file) return NULL;
int tmp, counter = 1, buff = 5, *v = malloc(buff * sizeof(int));
char *str;
fgets(str, 10000000, file); string e salva em str
while (sscanf(str,"%d", &tmp)) {
if (counter == buff) {
buff *= 2;
v = realloc(v,buff * sizeof(int));
}
v[counter++] = tmp;
}
v[0] = counter;
return v;
}
如果输入文件是
5 5
0.2 0.6 0.4
2 3 3
2 2 3
读取第三行所得的数组应为: v = {2,3,3}
但是我的代码导致: v = {2,2,2}
答案 0 :(得分:0)
sscanf
函数无法跟踪从诸如fscanf
函数之类的字符串中读取的内容,因为fscanf
函数从具有内部指针向前的文件流中进行读取。
要获得与字符串和sscanf
相同的效果,您需要手动将指针向前移动。以下代码段可用于从字符串中连续读取。
int pos = 0;
int amount;
while (sscanf(str+pos,"%d %n", &tmp, &amount)) {
pos += amount;
// Rest of the code inside the while loop
}
此处的pos变量代替了str
,而是使用str + pos
,它跟踪您从字符串中读取的内容,并像进度指示器一样工作。
每次使用对sscanf
的调用中读取的数量进行更新。 %n
格式说明符使我们可以读取实际处理了多少个字符。
此外,如注释中所述,您没有为str
分配任何内存。
您可以使用大小10000000
(这是您传递给fgets
的大小),也可以使用getline
(但是getline
不是标准C)。