如何仅将文本量未知的一行从文本文件读取到数组中(用C语言编写)

时间:2019-05-22 23:06:34

标签: c

我正在尝试从.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}

1 个答案:

答案 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)。