gpt4 book ai didi

c - 如何将文本文件中具有未知数量的整数的行读取到数组中(在 C 中)

转载 作者:行者123 更新时间:2023-11-30 16:17:22 25 4
gpt4 key购买 nike

我正在尝试从 .csr 文件(不完全是 .csr,而是基于 .csr 格式)读取矩阵。第一行包含矩阵的维度 (x,y)。下面的行有未知数量的 float ,下面的两行包含每个 float 所在的列和行。

我想我可以使用 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}

最佳答案

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
}

这里我们使用的是 str + pos,而不是 str,pos 变量跟踪您从字符串中读取了多少内容,并且充当进度指针。它每次都会根据调用 sscanf 时读取的数量进行更新。 %n 格式说明符让我们可以读取实际处理了多少个字符。

此外,正如评论中提到的,您没有为 str 分配任何内存。您可以使用大小10000000(这是您传递给fgets的大小)或使用getline (但是 getline 不是标准 C)。

关于c - 如何将文本文件中具有未知数量的整数的行读取到数组中(在 C 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56266074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com