| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1176 人关注过本帖
标题:C打开文件后出现了这样的错误,求大神解释……我是实在找不出来那里写错了… ...
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
#include <cstdio>
#include <cstring>
#include <conio.h>

struct Data
{
    double data1;
    double data2;
    double data3;
};

void main(int argc, char* argv[])
{
    if (argc < 2)
    {
        char programFileName[FILENAME_MAX];
        strcpy_s(programFileName, FILENAME_MAX, strrchr(argv[0], '\\') + 1);
        printf_s("\nUsage: %s <data_filename>\n", programFileName);
        _getch();
        return;
    }

    FILE* dataFile;
    errno_t errorCode;

    errorCode = fopen_s(&dataFile, argv[1], "rt");
    if (errorCode == 0)
    {
        Data data;
        int row = 0;
        while (!feof(dataFile))
        {
            ++row;
            int number = fscanf_s(dataFile, "%lf %lf %lf", &data.data1, &data.data2, &data.data3);
            if ((number != EOF) && (number < 3))
            {
                printf_s("Line: %d read data error\n", row);
                break;
            }
            printf_s("%f %f %f\n", data.data1, data.data2, data.data3);
        }
        fclose(dataFile);
    }
    else
    {
        printf_s("\nFile %s open failure!\n", argv[1]);
    }

    _getch();
}

授人以渔,不授人以鱼。
2012-10-16 21:29
zj0323
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-9-23
收藏
得分:0 


[ 本帖最后由 zj0323 于 2012-10-16 22:11 编辑 ]
2012-10-16 22:09
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:11 
以下是修改过把数据放入内存中的代码,使用了标准库集合vector类型,属于动态数组(在堆中分配内存)性质的东西,不需要使用链表,如果坚持用C,则需要用链表储存。

程序代码:
#include <cstdio>
#include <cstring>
#include <vector>
#include <conio.h>

struct Data
{
    double data1;
    double data2;
    double data3;
};

void Show_Data(const std::vector<Data>& data);

void main(int argc, char* argv[])
{
    if (argc < 2)
    {
        char programFileName[FILENAME_MAX];
        strcpy_s(programFileName, FILENAME_MAX, strrchr(argv[0], '\\') + 1);
        printf_s("\nUsage: %s <data_filename>\n", programFileName);
        _getch();
        return;
    }

    FILE* dataFile;
    errno_t errorCode = fopen_s(&dataFile, argv[1], "rt");
    if (errorCode != 0)
    {
        printf_s("\nFile %s open failure!\n", argv[1]);
        _getch();
        return;
    }
    std::vector<Data> dataList;
    int row = 0;
    while (!feof(dataFile))
    {
        ++row;
        Data data;
        int number = fscanf_s(dataFile, "%lf %lf %lf", &data.data1, &data.data2, &data.data3);
        if ((number != EOF) && (number < 3))
        {
            printf_s("Line: %d read data error\n", row);
            break;
        }
        dataList.push_back(data);
    }
    fclose(dataFile);

    Show_Data(dataList);

    _getch();
}

void Show_Data(const std::vector<Data>& data)
{
    for (size_t index = 0; index != data.size(); ++index)
    {
        printf_s("%f %f %f\n", data[index].data1, data[index].data2, data[index].data3);
    }
}

授人以渔,不授人以鱼。
2012-10-16 22:48
lwei
Rank: 5Rank: 5
等 级:职业侠客
威 望:3
帖 子:197
专家分:369
注 册:2005-5-4
收藏
得分:3 
修改三个地方后,正确运行。
第一个是long float 改为double
第二个EOF重定义了,我用gcc有这个定义。
第三个printf去掉最后那个&符号。
楼主的编译器是那个时代的古董啊,好久没有用过long float、longlong 这样的东东了。

2012-10-16 22:52
小习小习
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:6
帖 子:1467
专家分:4792
注 册:2012-7-2
收藏
得分:0 
回复 14楼 lwei
膜拜大牛。

实现自己既定的目标,必须能耐得住寂寞单干。
2012-10-16 22:56
chaoduiyoude
Rank: 1
等 级:新手上路
帖 子:22
专家分:1
注 册:2012-10-11
收藏
得分:0 
回复 13楼 TonyDeng
版主太牛b了……这段的作用完全没看懂……大学学C的时候用的VC6.0没接触过void main(int argc, char* argv[])这样的写法,用VS2010看到这样的预设编头直接傻了……:
 if (argc < 2)
    {
        char programFileName[FILENAME_MAX];
        strcpy_s(programFileName, FILENAME_MAX, strrchr(argv[0], '\\') + 1);
        printf_s("\nUsage: %s <data_filename>\n", programFileName);
        _getch();
        return;
特别是 strcpy_s(programFileName, FILENAME_MAX, strrchr(argv[0], '\\') + 1)这句是意思……?是在argv[0]里放置文件名还是怎么滴……?
2012-10-17 16:22
chaoduiyoude
Rank: 1
等 级:新手上路
帖 子:22
专家分:1
注 册:2012-10-11
收藏
得分:0 
回复 14楼 lwei
改了后还真能用了~谢谢啊呵呵~用的VS2010但大学学的是VC6,对于void main(int argc, char* argv[])的预设编头表示完全没见过也不知道咋用……能求大神解释一下不……?刚才百度了一下还是没怎么看懂啊,没有这个编头就不能把参数和其个数储存到系统内存中了么?
2012-10-17 16:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:3 
这个程序在命令行中启动,假设编译出来是Test.EXE,则它的格式是Test u.txt
argc是命令行中项目的数量,看上面的启动格式,是2项,分别是Test.EXE和u.txt。argv[]是字符串数组,argv[0]就是应用程序自身,它是带全路径的字符串,我那段代码是把路径删掉,只留下程序文件名;argv[1]就是第一个参数u.txt,用来处理你的数据文件。

授人以渔,不授人以鱼。
2012-10-17 17:21
青春无限
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江苏
等 级:贵宾
威 望:24
帖 子:3452
专家分:19340
注 册:2012-3-31
收藏
得分:0 
看看学习

学 会看代码…学习写程序…学会搞开发…我的目标!呵呵是不是说大话啊!!一切皆可能
2012-10-17 17:23
lz1234wnit
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-1-13
收藏
得分:0 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define LINE 280
#define COLUMN 3
void main(void)
{
    FILE *fp;
    double data[LINE][COLUMN]={0};
    int i=0;
    int j=0;
    if((fp=fopen("d:\\data\\u.txt","r"))==NULL)
    {
        perror("File open error !\n");
        return;
    }
    while(fscanf(fp,"%lf %lf %lf",&data[i][0],&data[i][1],&data[i][2])!=EOF)
    {
        printf("%lf %lf %lf \n",data[i][0],data[i][1],data[i][2]);//你那这多了个取地址   &data[i][2]);
        i++;
    }
}
2012-10-17 17:29
快速回复:C打开文件后出现了这样的错误,求大神解释……我是实在找不出来那里写 ...
数据加载中...
 
   



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

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