| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8142 人关注过本帖
标题:有关读取dat数据文件的问题
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
#include "stdafx.h"
#include <stdlib.h>

// 程序功能:从数据文件中读入数据,储存在the_Data中,这个量的数据类型是Matlib_Data
//           the_Data.Element_Number才是数据的个数

struct Matlib_Data
{
    unsigned int Element_Number;        // 真正的元素数目
    char Separate;                        // 数据文件使用的分隔符
    double Data[2048];                    // 储存数据的数组
} the_Data;

double Get_One_Data(FILE* fp, const char Separate);
bool Save_Data(const char FileName[], Matlib_Data* pData);

// 主程序入口
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.Data[the_Data.Element_Number] = Get_One_Data(fp, the_Data.Separate);
            printf_s("%.17f\n", the_Data.Data[the_Data.Element_Number]);        // 本行使用中可不要
            the_Data.Element_Number++;
        }
        the_Data.Element_Number--;
        fclose(fp);
        printf_s("\n总共读入%d个数据\n\n", the_Data.Element_Number);
        if (Save_Data("D:\\New.DAT", &the_Data))
        {
            printf_s("\n新的数据文件储存为D:\\New.DAT\n\n");
        }
    }
    else
    {
        printf_s("需要读入的数据文件无法打开\n\n");
    }

    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;
}

// 重新储存数据
bool Save_Data(const char FileName[], Matlib_Data* pData)
{
    FILE* fp;
    errno_t nError;

    nError = fopen_s(&fp, FileName, "w");
    if (nError == 0)
    {
        fseek(fp, 0, SEEK_SET);
        fwrite(pData, sizeof(*pData), 1, fp);
        fputc(EOF, fp);
        fclose(fp);
        return true;
    }
    else
    {
        printf_s("\n储存文件%s无法建立\n\n", FileName);
        return false;
    }

}


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

授人以渔,不授人以鱼。
2011-08-05 20:10
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
现在OK了,转存之后,fread()整个数据文件,就得到所有数据。

授人以渔,不授人以鱼。
2011-08-05 21:04
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
现在OK了,转存之后,fread()整个数据文件,就得到所有数据。

授人以渔,不授人以鱼。
2011-08-05 21:04
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 9楼 huaijuliu
程序代码:
#include <stdio.h>

int main(int argc, char* argv[]) {
    FILE * fp = fopen("externalrough1.dat", "r");
    double f = 0;
    if (!fp) {
        // TODO: warn about file operation failure
        return 1;
    }
    while (fscanf(fp, "%lf", &f) == 1) {
        // TODO: process the data
        // for example:
        printf("%f\n", f);
    }
    fclose(fp);
    return 0;
}


像上面那样用一个循环把文件里的浮点数一个一个读出来就好
2011-08-05 21:24
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
在本例中,原始的数据文件是明文字符流,读入这些数据,我们看到其实很麻烦。但C/C++的威力,在于它是用最直接的方式处理数据,不管在内存中,还是在外存中,只要数据的排布格式一样,对C/C++来说就没有内外存的区别,我们必须充分利用这一点,用途就在这里。

原先的数据文件,大小是40K,转换格式后储存的文件,大小是16K。前者需要分开逐个数据读入并进行类型转换,后者可以一次读入无需转换并将内存中使用的数据原样复现。做到这样的功能,才是学编程的核心,不是会用前面那种办法把数据读入了事,那不过是末技,如何处置数据才是本质。

[ 本帖最后由 TonyDeng 于 2011-8-6 11:19 编辑 ]

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



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

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