1

我正在从文件中读取数据,检索我有多少列和行(数据文件),到目前为止的一切。现在我正在尝试一个一个地读取这些值并将这些值存储到一个二维数组(双精度)中。我使用 getc 将值作为 char 获取,但是当我尝试使用 atoi 或 atof 将值从 char 转换为 double 时,我得到了奇怪的值。

double ther[j][number];
char c;
int tim=0,nther=0;


FILE *fp3 = fopen("data.txt", "r");
c = getc(fp3) ;

while (c!= EOF)
{ 

    ther[tim][nther]=atoi(&c);
    printf("%lf", ther[tim][nther]);


    nther++;
    c = getc(fp3);

    if(nther==number)
    {
        tim++;
        nther=0;
    }
    tim=0;
}

fclose(fp3);

有什么建议吗?…(我一直在寻找)。对不起,我有一个文件 data.txt,这个文件有一行一列数字:

1 2 3 4 5

6 7 8 9 10

所以我需要将数据存储到一个二维数组中:感谢答案,我有一些想法,比如:使用一个字符串,然后划分所有值并存储它们中的每一个。第一行是字符串-> 数组[0][0]、数组[0][1] 等。然后移动到另一行并执行相同操作。

到目前为止,我得到了一些数值,但它们都没有存储在 data.txt 中。

4

3 回答 3

1

您可以使用fscanf从文件中读取双精度。一个例子是:

double d;
fscanf("%f", &d);

fscanf 可以做的远不止这些,所以我建议检查文档

您使用的方法获取单个字符(正如马特麦克纳布指出的那样 - 不正确)。一个字符是 1 个字节,可以存储 0-255 的值。您正在以文本模式阅读,因为您没有使用 fopen 指定模式(通常认为明确要求二进制 "rb/wb" 或文本 "rt/wt" 模式是一种好习惯)。这意味着您读取单个数字的ASCII 值。

因此,假设该文件包含:

7.2, 3.0, 1.0

第一次调用getc(fp3)将获得字符“7”,对于 ASCII,其值为 55。显然,这不会给你你正在寻找的东西。

相反,您可以使用:

double d[3];
fscanf("%f, %f, %f" &d[0], &d[1], &d[2]);

这将获得文件中的三个浮点值。

于 2014-03-28T04:50:28.763 回答
1

首先,应该是int c;。该getc()函数必须能够为所有可能char的 s 返回不同的值,以及不同的值EOF(表示文件结束或流错误)。

如果您使用char c;,那么您最终必须EOF转换为合法字符的值,因此您无法区分这两种情况。换句话说,您的代码可能表现得像是命中了EOF,而实际上它只是命中了那个特定的字符。

继续前进,atoi(&c)是不正确的。如果你阅读了atoi函数的文档——在使用函数时这总是一个好主意——你会发现它需要一个字符串作为输入。但是,&c不是字符串。它是单个字符的地址。

所以你的选择是:

  • 构造一个字符串并将其传递给atoi
  • 不要使用atoi

你没有说你期望发生什么;但是如果你想将你读入的字符转换为'3'整数,3那么你可以写:ther[tim][nther] = c - '0';

但是,当您阅读不是数字的内容时,您还应该有一些代码来处理案例。

如果您想一次读取多个字符(例如"31"-> 31),那么使用的方法getc是不合适的 - 您需要切换到使用一次读取多个字符的函数,例如fscanfor fgets

最后,您设置tim0每个循环迭代,因此tim++永远不会产生任何持久的影响,也许这是一个疏忽。

于 2014-03-28T04:55:22.293 回答
0
#include <stdio.h>

int main(){
    int j = 2;
    int number = 5;

    double ther[j][number];
    double d;
    int tim=0,nther=0;
    FILE *fp3 = fopen("data.txt", "r");

    while (fscanf(fp3, "%lf", &d)==1){
        ther[tim][nther]=d;
        printf("%g ", ther[tim][nther++]);

        if(nther==number){
            ++tim;
            nther=0;
            printf("\n");
        }
    }
{
    int r, c;
    for(r=0;r<tim;++r){
        for(c=0;c<number;++c){
            printf("%f ", ther[r][c]);
        }
        printf("\n");
    }
}
    return 0;
}
于 2014-03-28T08:35:49.767 回答