| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8142 人关注过本帖
标题:有关读取dat数据文件的问题
只看楼主 加入收藏
huaijuliu
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2009-9-17
收藏
 问题点数:0 回复次数:14 
有关读取dat数据文件的问题
新手向各位前辈请安了。
有一个dat文件,里面是由matlab生成的一个一维数组,试图将其读取至某指针中。我大体上知道应该用fread or fscanf or fgets来读取文件,但具体实施不是很清楚。
我试着编写了如下程序,但输出结果全部为0.有几点还需请教前辈:1,我必须知道我的dat文件的数据的字节才能采用fread吗?我如何知道这个字节呢?2,这种采用fread好还是其他函数好呢?
感谢大家。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
    int i;
double help[2049];
FILE *fp = fopen("externalrough1.dat", "r");
if(fp==NULL)
{
printf("Cannot open file strike any key exit!");
exit(1);
}
fread(help,8,2049,fp);
FILE *fh=fopen("LIANXI.dat","w");
for (i=0; i<=2048; i++) fprintf(fh,"%f\n",help[i]);
fprintf (fh, "\n");
fclose(fh);
}
externalrough1.rar (18.59 KB)

搜索更多相关主题的帖子: double matlab dat文件 include 
2011-08-04 23:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你这样读是不行的,2048这个数字本身就是你想当然的,事实上这个数据文件有40K多字节,而且它不是直接以double型数据储存的,是以字符串明文储存的。

[ 本帖最后由 TonyDeng 于 2011-8-5 00:38 编辑 ]

授人以渔,不授人以鱼。
2011-08-04 23:46
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
文件打开有两种方式,一个是文本形式,另一个是二进制形式,默认情况下是以文本方式来打开的,“文本流”可以看作是“字符流”(当然这种理解不科学), 我看了一下你的那个文件里的数据,完全是可以看见的(不是乱码),建议你不要使用fread函数,可以使用fscanf或者是fgets

只是个人见解

愿用余生致力编程
2011-08-05 00:16
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
是的,3楼的想法靠谱。再提示一下,这些数据以TAB符作分隔符,即遇到ASCII码为9即是分隔数据标志了。

授人以渔,不授人以鱼。
2011-08-05 00:20
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
直接 fscanf(file_pointer, "%lf", &var); 就可以了
2011-08-05 00:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
用fscanf()是可以的,楼主只是要注意事先申请足够大的空间数组来容纳这些数据,同时一定要逐个逐个数据读,每个计数,最后才知道真正读进来多少个数据。这个文件的储存,大概是20byte一个数,先从文件的字节数估计一下数组容量就是了,适当留一些位置,初步看未必全是20byte一个的。

授人以渔,不授人以鱼。
2011-08-05 00:36
baobaoisme
Rank: 7Rank: 7Rank: 7
来 自:AVATAR
等 级:黑侠
帖 子:260
专家分:506
注 册:2010-7-9
收藏
得分:0 
fread是按块来读取,一般用于读二进制数据。先确定你所要读取的文件当时是怎么存储的。
2011-08-05 01:34
huaijuliu
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2009-9-17
收藏
得分:0 
感谢楼上各位朋友的帮助 小弟继续努力 有了结果前来共享
2011-08-05 16:42
huaijuliu
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2009-9-17
收藏
得分:0 
回复 5楼 voidx
您好感谢您的提示 但我还是不会用fscanf 我编写如下 可是第二个到最后一个数据都不正确 您看是不是需要用for循环给fscanf? 感谢您
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
    int i;
double help[2049];
FILE *fp = fopen("externalrough1.dat", "r");
if(fp==NULL)
{
printf("Cannot open file strike any key exit!");
exit(1);
}
fscanf(fp, "%lf", &help);
FILE *fh=fopen("LIANXI.dat","w");
for (i=0; i<=2048; i++) fprintf(fh,"%f\n",help[i]);
fprintf (fh, "\n");
fclose(fh);
}
2011-08-05 16:55
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
#include "stdafx.h"
#include <stdlib.h>

struct Matlib_Data
{
    unsigned int Element_Number;
    double Data[4096];
    char Separate;
} the_Data;

double Get_One_Data(FILE* fp, const char Separate);

int _tmain(int argc, _TCHAR* argv[])
{
    FILE* fp;
    errno_t nError;
    
    the_Data.Separate = 0x09;            // 数据分隔符为TAB
    the_Data.Element_Number = 0;        // 数据数目

    nError = fopen_s(&fp, "D:\\externalrough1.dat", "r");
    if (nError == 0)
    {
        fseek(fp, 0, SEEK_SET);
        while (!feof(fp))
        {
            the_Data.Element_Number++;
            the_Data.Data[the_Data.Element_Number-1] = Get_One_Data(fp, the_Data.Separate);
            printf_s("%.17f\n", the_Data.Data[the_Data.Element_Number-1]);
        }
    }
    fclose(fp);

    printf_s("\n总共读入%d个数据\n\n", the_Data.Element_Number - 1);

    return 0;
}

// 从数据文件读入一个数据
double Get_One_Data(FILE* fp, const char Separate)
{
    int ch;
    char Buffer[256];
    char* pBuffer = Buffer;
    double data;

    ch = fgetc(fp);
    while (ch != EOF && ch != Separate)
    {
        *pBuffer = ch;
        pBuffer++;
        ch = fgetc(fp);
    }
    *pBuffer = '\0';
    
    sscanf_s(Buffer, "%lf", &data, _countof(Buffer));

    return data;
}

授人以渔,不授人以鱼。
2011-08-05 20:10
快速回复:有关读取dat数据文件的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033075 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved