如何使用fscanf在C中读取双精度

如何使用fscanf在C中读取双精度,c,scanf,C,Scanf,我目前正在编写一个程序,接收未知数量的双倍数据,每一行都来自一个文本文件。它应该将这些读取的元素放入一个数组中,但它不起作用。我的打印循环工作,但它只打印零。在来这里之前,我已经尝试了很多东西,也查阅了很多资料。这是我的密码 #include <stdio.h> #include <stdlib.h> int main() { //Open an file to read from FILE *file; file = fopen("data.t

我目前正在编写一个程序,接收未知数量的双倍数据,每一行都来自一个文本文件。它应该将这些读取的元素放入一个数组中,但它不起作用。我的打印循环工作,但它只打印零。在来这里之前,我已经尝试了很多东西,也查阅了很多资料。这是我的密码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    //Open an file to read from
    FILE *file;
    file = fopen("data.txt","r");
    if (file == NULL)
    {
        printf("File not found.");
        return -1;
    }

    //Count the number of lines in the input file
    int numLines = 0; //CHANGE TO 1 ???
    int ch;
    do
    {
        ch = fgetc(file);
        if (ch == '\n')
            numLines++;
    } while (ch != EOF);

    //Put all of the data read into an array;
    double input[numLines];
    int i = 0;
    while ((fscanf(file, "%lf\n", &input[i])) == 1)
        i++;

    //Close the file
    fclose(file);

    //Test printing elements of array
    for (i = 0; i < numLines; i++)
        printf("%lf\n", input[i]);

    return 0;
}
#包括
#包括
int main()
{
//打开要从中读取的文件
文件*文件;
file=fopen(“data.txt”、“r”);
if(file==NULL)
{
printf(“未找到文件”);
返回-1;
}
//计算输入文件中的行数
int numLines=0;//是否更改为1???
int-ch;
做
{
ch=fgetc(文件);
如果(ch='\n')
numLines++;
}while(ch!=EOF);
//将读取的所有数据放入一个数组中;
双输入[numLines];
int i=0;
while((fscanf(文件,“%lf\n”,&input[i]))==1)
i++;
//关闭文件
fclose(文件);
//测试阵列的打印元素
对于(i=0;i
OP对
fscanf()
的测试结果良好,只是代码没有检查文件中是否有太多的数字

while ((fscanf(file, "%lf\n", &input[i])) == 1)
    i++;
然后,代码忽略了
i
的最后一个值,而是打印
numLines
次,即使成功扫描的次数较少

for (i = 0; i < numLines; i++)
    printf("%lf\n", input[i]);
(i=0;i printf(“%lf\n”,输入[i]); 结束代码应该是

while (i < numLines && (fscanf(file, "%lf\n", &input[i])) == 1)
    i++;
for (j = 0; j < i; j++)
    printf("%lf\n", input[j]);
while(i
这将打印0行!需要重置该文件以进行第二次传递

倒带(文件);
而(i
另一个问题是假定
'\n'
的计数与数字的计数相同。如果每行有多个数字,或者最后一行有一个数字但没有
“\n”
,这很容易被愚弄


一个简单的解决方法是使
输入[]
1变大,并使用实际扫描成功计数作为要打印的数字计数。更健壮的代码将使用
fgets()
一次读取一行,并包括额外的错误检查。

在计算行数后,您需要输入文件指针,否则在尝试读取实际输入数据时,您仍然处于文件末尾。您希望使用类似
%lf”
的格式(而不是
%lf\n
)为了跳过任何前导空格,而不是任何尾随空格。您只需要执行
printf(“%f\n”,输入[i])
l
没有任何影响,因为有一个用于float的printf格式说明符,它会自动升级为double。这很有效。谢谢。@Jens为这段代码编写的
%lf”
%lf”
%lf\n”
%lf\n”
都同样有效<代码>“%lf”
是最简单的。
rewind(file);
while (i < numLines && (fscanf(file, "%lf\n", &input[i])) == 1)
  ...