0

我正在尝试从文件中读取并使用 c 将其存储在矩阵中。我的代码是

ReadSparseInput (int nvtxs,int nsize, double  vector[], int rowptr[] ,int colind [] , double values[])
{
    int index,row=0,column=0;
    int sparsity_value, nvtxs_local;
    int VECTOR_SIZE =50;
    double value;
    double  randvect[VECTOR_SIZE];
    int  length=0;
    char buf[BUFSIZ];
    FILE *fp;
    fp=fopen("/home/lopez380/Parallel/m10-A.ij", "r");
    index =0;
    nvtxs_local = 0;
    rowptr[0] = 0;
    char *p1;
    while ( !feof(fp))
    {
         // null buffer, read a line
        buf[0] = 0;
        fgets(buf, BUFSIZ, fp);
        // if it's a blank line, ignore
        if(strlen(buf) > 1) 
        {
            p1 = strtok(buf, " ");
            row=atoi(p1);
            #ifdef DEBUG
                fprintf(stdout, "Row : %d ", row);
            #endif
            p1 = strtok(NULL, " ");
            column=atoi(p1);
            #ifdef DEBUG
                fprintf(stdout, "column : %d ", column);
            #endif
            p1 = strtok(NULL, " ");
            value=atof(p1);
            #ifdef DEBUG
                fprintf(stdout, "value : %g\n ", value);
            #endif
        }

    }
    fclose(fp);

    #ifdef DEBUG
    printf("lFileLen = %d\n", length);
    #endif

}

当我使用 p1 并使用 atoi 将其转换为整数时,该代码运行良好。但是当我使用 atof 将值转换为浮点数时,我得到一个零。我的输入看起来像

0 0 1.76420546156578
0 3 -4.80876443295632
0 6 1.20260376970926
0 9 3.30693451100554
1 1 1.13901264701619
1 4 0.370358438592131
1 7 -0.551593262343761

在我阅读了这个输入之后,当我打印它时,我得到了

 Row : 0 column : 0 value : 0
 Row : 0 column : 3 value : 0
 Row : 0 column : 6 value : 0
 Row : 0 column : 9 value : 0
 Row : 1 column : 1 value : 0
 Row : 1 column : 4 value : 0
 Row : 1 column : 7 value : 0

当我使用 atoi 时,我得到以下信息

Row : 0 column : 0 value : 1
 Row : 0 column : 3 value : -4
 Row : 0 column : 6 value : 1
 Row : 0 column : 9 value : 3
 Row : 1 column : 1 value : 1
 Row : 1 column : 4 value : 0
 Row : 1 column : 7 value : 0

有人可以帮帮我吗?

4

3 回答 3

1

由于上述原因,更换

value = atof(p1);

...和...

if( sscanf(p1,"%s",&value) != 1) { 
    fprintf(stderr,"Error: non-number found!\n");
    exit(1); 
}
于 2013-04-18T12:45:59.133 回答
1

我强烈建议您不要使用 atoi() 和 atof(),除非您的实现提供错误检查(例如 atoi() 和 atof()" update errno

我更喜欢 fscanf():通过返回值可以检测到非法输入。

例子:

if (fscanf(fp, "%f", &f) == 1)
    ...all OK...
else
    ...EOF or conversion failure...
于 2013-04-18T00:07:08.613 回答
0

评论中描述的 paulsm4 解决方案是

 fp=fopen("/home/lopez380/Parallel/m10.vec", "r");
    int i=0;
    double val;
    while ( !feof(fp))
    {
        buf[0] = 0;
        fgets(buf, BUFSIZ, fp);
        if(strlen(buf) > 1) 
        {
            p1 = sscanf(buf, "%lf",&val );
            vector[0]=val;
            ++i;
            #ifdef DEBUG
                fprintf(stdout, "vector : %lf \n", vector[0]);
            #endif
        }
    }
    fclose(fp);

输出达到

vector : 0.837565
vector : 3.074878
vector : -3.968584
vector : 3.975388
vector : 0.703345

将值(由空格分隔)读取到我使用的多个数组中

 sscanf(buf, "%d%d%lf",&row,&column,&value );

buf 有一个数据类型

char buf[BUFSIZ];
于 2013-04-19T21:54:04.320 回答