我即将实现一个动态矩阵结构(存储 double 值),但在读取文件时遇到了一些问题。
这个想法是,程序事先不知道行数和列数。它必须扫描第一行才能找到列数。
简单地使用 fscanf()
扫描 double 的问题是,(据我所知)它无法区分换行符和空格字符,因此它会读取整个文件作为一行。
为了解决这个问题,我首先使用函数fscanf()
逐个字符地读取该行。它将值存储在一个字符串中,该字符串恰好代表一行。
然后我使用 sscanf() 扫描字符串中的 double 值并将它们存储在 double 组中。转换后我释放了字符串。这是在 chararray_to_doublearray 函数中完成的。
现在,经过一些测试,我怀疑 chararray_to_doublearray 函数未按预期工作。
/* Converts a character array to a double array and returns a pointer to it. Frees the space of the character array, as it's no longer needed. */
double *chararray_to_doublearray(char **chararray)
{
int i;
int elements = 0;
double *numbers=NULL;
double newnumber;
while (sscanf(*chararray, "%lf ", &newnumber) == 1) {
double* newarray = (double*) malloc(sizeof(double) * (elements+1));
for (i = 0; i < elements; ++i)
newarray[i] = numbers[i];
free(numbers);
numbers = newarray;
numbers[elements] = newnumber;
++elements;
}
free(*chararray);
return numbers;
}
并且 main() 函数仅调用 chararray_to_doublearray 函数:
main ()
{
int i;
double *numbers;
char string[50]="12.3 1.2 3.4 4 0.3";
numbers=chararray_to_doublearray(&string);
free(numbers)
return 0;
}
总结一下:我找不到任何从用户(或文件)读取双值直到行尾的良好实现。这是我的实现。 您有什么想法吗?这可能有什么问题?
问候,
naroslife
最佳答案
这是一个XY problem 。您真的需要“fscanf()
逐个字符地执行该行”吗?这是否导致您向错误的方向提出了太多问题?
考虑一下:%lf
表示将字符转换为您选择的 double
...当没有更多合适的字符可供转换时,它会立即停止。 .并且换行符不是一个合适的转换字符...您的脑海中是否有一个灯泡在闪烁?
在您的情况下,格式字符串中 %lf
后面的空格会导致有用信息(无论空格是否为换行符)被丢弃。停止!你已经走得太远了,结果是你现在需要一个中间字符数组转换函数,这是不必要的膨胀。
有了这个新发现,从格式字符串中删除空格将导致后固定换行符留在流中,请考虑使用 fgetc
来处理常规白色之间的区别- 空格和换行符。
例如
double f;
int x = scanf("%lf", &f);
int c;
do {
c = getchar();
} while (isspace(c) && c != '\n');
if (c != '\n') {
ungetc(c, stdin);
}
参见上文,我如何区分换行符和非换行符空格?
关于在 C 中将字符串转换为 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34012497/