C语言读取txt文件中的数据,printf显示读取的数与txt中存的数不一致,怎么回事

kengyoudi5493 2017-05-24 09:46:24
#include <stdio.h>

double **array2DI(int col, int row)
{
double **dst;
int i;
dst = (double**)malloc(sizeof(double*)*col);
dst[0] = (double*)malloc(sizeof(double)*row*col);
for (i = 1; i<col; i++)
dst[i] = dst[i - 1] + row;
return dst;
}
void arrayFree2DI(double **array)
{
if (array != NULL)
{
free(array[0]);
free(array);
array = NULL;
}
return;
}

void main()
{
int width = 30;
int height = 20;
double **joint=array2DI(width, height);
FILE *fpRead = fopen("BJ.txt", "r");
if (fpRead == NULL)
{
return 0;
}
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
fscanf(fpRead, "%lf ", &joint[y][x]);
if (y == 10)
{
printf("joint[%d][%d]=%4f\n", y + 1, x + 1, joint[y][x]);
}
}
}printf("\n");

for (int x = 0; x < width; x++) {
printf("joint[11][%d]=%4f\n", x + 1, joint[10][x]);
}printf("\n");


printf("\n");
fclose(fpRead);
arrayFree2DI(joint);
}

环境是VS2013,结果如图


我的数组矩阵中第11行的数字,为什么两次printf的结果不一样??
...全文
894 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
幻夢之葉 2017-07-21
  • 打赏
  • 举报
回复
1L已经指明了,就是颠倒使用 dst = (double**)malloc(sizeof(double*)*col); //row? dst[0] = (double*)malloc(sizeof(double)*row*col); for (i = 1; i<col; i++) dst[i] = dst[i - 1] + row; //col?
yi19861209 2017-07-21
  • 打赏
  • 举报
回复
kengyoudi5493 2017-07-16
  • 打赏
  • 举报
回复
引用 5 楼 cfjtaishan 的回复:
double **array2DI(int col, int row)
{
    double **dst;
    int i;
    dst = (double**)malloc(sizeof(double*) * row);

    for (i = 0; i < col; i++)
        dst[i] = (double*)malloc(sizeof(double) * col);

    /*
    for (i = 1; i<col; i++)
        dst[i] = dst[i - 1] + row;
    */
    return dst;
}
改一下函数array2DI的实现试试; 另外, main函数里return 0(打开文件失败时)和其类型void不匹配。
我用了你修改的,结果还是一样的,还有别的修改方法吗?
赵4老师 2017-05-26
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int **newarr2d(int rows,int cols) {
    int **p,i;

    p=(int **)malloc(rows*sizeof(int *));
    if (NULL==p) exit(1);
    for (i=0;i<rows;i++) {
        p[i]=(int *)malloc(cols*sizeof(int));
        if (NULL==p[i]) exit(1);
    }
    return p;
}
void deletearr2d(int **p,int rows) {
    int i;

    for (i=0;i<rows;i++) {
        free(p[i]);
    }
    free(p);
}
int main() {
    int **arr2d,i,j,r,c;

    r=4;
    c=5;
    //在堆中开辟一个4×5的二维int数组
    arr2d=newarr2d(r,c);
    for (i=0;i<r;i++) {
        for (j=0;j<c;j++) {
            arr2d[i][j]=i*c+j;
        }
    }
    for (i=0;i<r;i++) {
        for (j=0;j<c;j++) {
            printf(" %2d",arr2d[i][j]);
        }
        printf("\n");
    }
    deletearr2d(arr2d,r);

    r=6;
    c=3;
    //在堆中开辟一个6×3的二维int数组
    arr2d=newarr2d(r,c);
    for (i=0;i<r;i++) {
        for (j=0;j<c;j++) {
            arr2d[i][j]=i*c+j;
        }
    }
    for (i=0;i<r;i++) {
        for (j=0;j<c;j++) {
            printf(" %2d",arr2d[i][j]);
        }
        printf("\n");
    }
    deletearr2d(arr2d,r);

    return 0;
}
//  0  1  2  3  4
//  5  6  7  8  9
// 10 11 12 13 14
// 15 16 17 18 19
//  0  1  2
//  3  4  5
//  6  7  8
//  9 10 11
// 12 13 14
// 15 16 17
//
赵4老师 2017-05-25
  • 打赏
  • 举报
回复
使用数据断点功能Debug 参考下面:
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
kugeniha 2017-05-25
  • 打赏
  • 举报
回复
因为你读取的时候行列颠倒了
yi19861209 2017-05-25
  • 打赏
  • 举报
回复
自信男孩 2017-05-25
  • 打赏
  • 举报
回复
在两次输出中间没有其他操作,理论上是不改输出结果不一致的。所以,很有可能是申请(malloc)内存时出了问题。所以,仔细看一下array2DI的实现吧
自信男孩 2017-05-25
  • 打赏
  • 举报
回复
double **array2DI(int col, int row)
{
    double **dst;
    int i;
    dst = (double**)malloc(sizeof(double*) * row);

    for (i = 0; i < col; i++)
        dst[i] = (double*)malloc(sizeof(double) * col);

    /*
    for (i = 1; i<col; i++)
        dst[i] = dst[i - 1] + row;
    */
    return dst;
}
改一下函数array2DI的实现试试; 另外, main函数里return 0(打开文件失败时)和其类型void不匹配。
  • 打赏
  • 举报
回复
你用到了二维数组,我看循环次数不是太多,你可以在出问错的那次循环那里设置断点 (条件断点),然后看是谁改了那里的数值。
kengyoudi5493 2017-05-24
  • 打赏
  • 举报
回复
我首先定义了一个二维的动态数组,然后用动态数组去读取txt文件中的数字,一共是30*20个,读取的时候,我用了printf,显示的数字是对的,全部读取完毕后,我又用printf显示了某一行,发现和txt中数字有出入

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧