| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2084 人关注过本帖
标题:找到错误了,但不知道为什么出错...好像第一次运行还是对的,总之求教啦...
只看楼主 加入收藏
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
结帖率:97.22%
收藏
已结贴  问题点数:40 回复次数:61 
找到错误了,但不知道为什么出错...好像第一次运行还是对的,总之求教啦...
程序代码:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    size_t str_count = 0;
    fpos_t *postition = NULL;
    char *buffer = NULL;
    size_t length = 0;
    int jilu = 0;
    char *temp = NULL;
    int i = 0;

    char *Input_filename = "E:\\才、\\Test\\test1.bin";
    char *Out_filename = "E:\\才、\\Test\\tests.bin";
    FILE *Input_pfile = NULL;
    FILE *Out_pfile = NULL;

    if(!(Input_pfile = fopen(Input_filename, "rb")))
    {
        printf("读取文件%s faild!\n",Input_filename);
        return 1;
    }
   
    /* 得到字符串数目 */
    while(1)
    {
        fread(&length, sizeof(size_t), 1, Input_pfile);

        if(feof(Input_pfile))
            break;

        if( jilu < (int)length)
        {
            jilu = length;
            temp = buffer;
            free(temp);
            temp = NULL;
            buffer = (char*)malloc(length+1);
        }
          fread(buffer, sizeof(char), length, Input_pfile);
        str_count++;
    }

    printf("The count of strings are %d\n",str_count);

    postition = (fpos_t*)malloc(str_count-1);

    rewind(Input_pfile);

    fread(&length, sizeof(size_t), 1, Input_pfile);
    fread(buffer, sizeof(char), length, Input_pfile);

    for(i=0;i<(int)str_count-1;i++)
    {
        fgetpos(Input_pfile, &postition[i]);
        fread(&length, sizeof(size_t), 1, Input_pfile);
        fread(buffer, sizeof(char), length, Input_pfile);
    }

    printf("\nEE\n");
    if(!(Out_pfile = fopen(Out_filename, "wb")))     /* 在这里出错了,运行到这里会出警告,可应该没错啊? */
    {
        printf("error!\n");
        return -1;
    }
    printf("\nEE\n");
    for(i=0;i<(int)str_count-1;i++)
    {
        fsetpos(Input_pfile, &postition[str_count-2-i]);
        fread(&length, sizeof(size_t), 1, Input_pfile);
        fwrite(&length, sizeof(size_t), 1, Out_pfile);
        fread(buffer, 1, length, Input_pfile);
        fwrite(buffer, 1, length, Out_pfile);
    }
    rewind(Input_pfile);
    fread(&length, sizeof(size_t), 1, Input_pfile);
    fwrite(&length, sizeof(size_t), 1, Out_pfile);
    fread(buffer, 1, length, Input_pfile);
    fwrite(buffer, 1, length, Out_pfile);

    fclose(Out_pfile);
    fclose(Input_pfile);

    Out_pfile = fopen(Out_filename, "rb");
    printf("The strings in the %s are:\n",Out_filename);
    for(i=0;i<(int)str_count;i++)
    {
        fread(&length, sizeof(size_t), 1, Out_pfile);
        fread(buffer, sizeof(char), length, Out_pfile);

        buffer[length] = '\0';
        printf("%s\n",buffer);
    }

    fclose(Out_pfile);
    remove(Input_filename);
    remove(Out_filename);
    return 0;
}

/* 路径大家可以根据自己的电脑来定义,谢谢 */
搜索更多相关主题的帖子: 还是 
2013-01-01 01:26
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
我发现测试3个或三个以内的字符串不会出错,
可是超过三个(我试的是4个)程序会出现错误,
又是这个倒霉的状况,希望各位大虾看一看啊

I have not failed completely
2013-01-01 01:45
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:10 
述说你的目的啊

怎么在我电脑上 用2710个字节的文件 能变出一个1,668,177,920 字节的文件呢(好像是无限增大,被我强行终止程序的运行的了)  貌似存在死循环  无限次的向文件中写数据

DO IT YOURSELF !
2013-01-01 06:31
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
试用了 记事本  word  vs2010  均无法打开1.6G的文件

DO IT YOURSELF !
2013-01-01 06:32
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
额,这么严重啊...
原意是读取二进制文件Input_filename中的字符串(每个字符串前有一个size_t类型的记录其后字符串长度的数据)题目规定需从最后一个字符串开始读入,最开始的字符串最后一个读入,最后将它写入新文本
这是Input_filename文件:
test1.zip (556 Bytes)

不过我看了文件,应该不是它的问题

程序代码:
 printf("\nEE\n");
    if(!(Out_pfile = fopen(Out_filename, "wb")))     /* 在这里出错了,运行到这里会出警告,可应该没错啊? */
    {
        printf("error!\n");
        return -1;
    }
    printf("\nEE\n");
可这里既没有循环同时也加了检查啊,怎么还会出错呢?
而且当Input_filename中的字符串小于四个却可以正常运行,可这跟打开文件有关系吗....
凌乱了,大神小牛们帮帮忙啊,分如数奉上

I have not failed completely
2013-01-01 08:47
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
对了,这是制作Input_filename文件的代码,供调试使用,顺便看看有没有什么错误的地方谢谢:
程序代码:
/* practice of 12.1 */
#include <stdio.h>
#include <stdlib.h>

#define MAX 8

int main(void)
{
    char *buffer = (char*)malloc(MAX);
    char *temp = NULL;
    size_t count = 0;
    size_t size = MAX;
    char answer = 0;
    size_t i = 0;
    FILE *pfile = NULL;
    char *filename = "E:\\才、\\Test\\test1.bin";

    if(!(pfile = fopen( filename, "wb")))
    {
        printf("创建文件%s失败!\n",filename);
        return -1;
    }

    for(;;)
    {
    printf("您%s输入字符串吗?(y/n):", count == 0? "":"还想");
    scanf(" %c",&answer);
    fflush(stdin);

    if(answer == 'n' || answer == 'N')
        break;

    while((buffer[count++] = getchar()) != '\n')
    {
   
        if(count == size)
        {
          size += MAX;
          temp = (char*)malloc(size);

          for(i=0;i<count;i++)
              temp[i] = buffer[i];

          free(buffer);
          buffer = temp;
          temp = NULL;
        }
    }
    buffer[--count] = '\0';

    printf(" is %d of\n %s\n\n",count, buffer);
    fwrite(&count, sizeof(count), 1, pfile);
    fwrite(buffer, sizeof(char), count, pfile);
   
    count = 0;
    }
   
    fclose(pfile);
    return 0;
}


I have not failed completely
2013-01-01 08:51
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
实在是不明白,若能解决,我在另一个帖子里还送40分
求解啊...

I have not failed completely
2013-01-01 09:42
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
以下是引用神龙赖了在2013-1-1 08:47:47的发言:

额,这么严重啊...
原意是读取二进制文件Input_filename中的字符串(每个字符串前有一个size_t类型的记录其后字符串长度的数据)题目规定需从最后一个字符串开始读入,最开始的字符串最后一个读入,最后将它写入新文本
这是Input_filename文件:

不过我看了文件,应该不是它的问题

 printf("\nEE\n");
    if(!(Out_pfile = fopen(Out_filename, "wb")))     /* 在这里出错了,运行到这里会出警告,可应该没错啊? */
    {
        printf("error!\n");
        return -1;
    }
    printf("\nEE\n");
可这里既没有循环同时也加了检查啊,怎么还会出错呢?
而且当Input_filename中的字符串小于四个却可以正常运行,可这跟打开文件有关系吗....
凌乱了,大神小牛们帮帮忙啊,分如数奉上
确实很严重,这个代码存在的问题不是死循环,而是对length的强行写入,造成这个size_t类型的变量被错误的赋予了几十亿大小的数值,我测试的结果是18亿7千万多的大小,然后再以这个大小去创建buffer的空间并读入这个大小加1的buffer内容造成了buffer无限放大,又以这个buffer写入目标文件,就造成了一个类似被无限增殖的目标文件。
还有你的代码中有两个从来不执行的循环和一个只执行一次的循环,没看懂有什么用
强行写入length的句子是fread(&length, sizeof(size_t), 1, Input_pfile);
以length的大小申请buffer空间的句子是buffer = (char*)malloc(length+1)
以length的大小写入目标文件的句子是 fwrite(buffer, 1, length, Out_pfile);(正是这个句子造成了一个长达1.6G的目标文件)
而楼主代码中4个循环,第1,4个只执行一次,2,3不执行


新手一点愚见,谨供参考


认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-01 11:37
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
回复 8楼 yaobao
额,不过我读取的是自己事先写入的文件(6楼代码),先将字符串数目以size_t类型写入,然后再写入字符串,所以读取的时候应该也可以先拿出事先写入的size_t类型的数值啊...
图片附件: 游客没有浏览图片的权限,请 登录注册


运行了4次,str_count == 4 ,但字符串低于4个则不会出错
怎么会这样
EE说明程序运行到打开Out_filename文件那一段就了无音信了

正所谓:"风萧萧兮易水寒,壮士一起洗没水了..."好悲催啊...

I have not failed completely
2013-01-01 12:50
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
早说啊,我这一上午算是白费劲了,原来要两段代码放一起啊,楼主,我恨你恨到彻底忘记

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-01 13:08
快速回复:找到错误了,但不知道为什么出错...好像第一次运行还是对的,总之求教 ...
数据加载中...
 
   



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

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