| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2084 人关注过本帖
标题:找到错误了,但不知道为什么出错...好像第一次运行还是对的,总之求教啦...
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
当14楼透明的呢

授人以渔,不授人以鱼。
2013-01-01 16:05
朱三哥
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:311
专家分:359
注 册:2012-12-11
收藏
得分:0 
初步判断应该是 数据覆盖 造成的错误
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++;
    }
这段代码是有问题的

哥,破你无线很难的,不要老是改,少看路由器上的灯,你会死啊
2013-01-01 16:08
朱三哥
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:311
专家分:359
注 册:2012-12-11
收藏
得分:0 
回复 21楼 TonyDeng
我错了,错了,哎

哥,破你无线很难的,不要老是改,少看路由器上的灯,你会死啊
2013-01-01 16:09
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:10 
程序代码:
#include <stdio.h>
#include <stdlib.h>


#define MAX 8

int file(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 = "F:\\vc\\666.txt";

    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;
    fflush(stdin);
    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;
        }
    }



    fwrite(&count, sizeof(count), 1, pfile);
    fwrite(buffer, sizeof(char), count, pfile);

 
    count = 0;
    }
  


    fclose(pfile);
    return 0;
}

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 = "F:\\vc\\666.txt";
    char *Out_filename = "F:\\vc\\222.txt";
    FILE *Input_pfile = NULL;
    FILE *Out_pfile ;
    file();
    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");
  Out_pfile = fopen("F:\\vc\\222.txt","wb");   /* 在这里出错了,少于11个字符运行到这里会出警告 */

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

这是我鼓秋一下午弄出来的代码,我对他寄予厚望,可是我却弄出个怪胎来,或许只是我才疏学浅不明就里吧,上面是我的代码。
之所以说它是怪胎是因为我发现这段代码有个很奇特的地方:当输入时头三行无所谓,怎么输入都行,但是从第四行开始所如入的字符必须多余10个,不然在代码的红色语句就会挂掉。
我知道有点匪夷所思,可这是事实,我为此实验了一个多小时,下面是截图
图片附件: 游客没有浏览图片的权限,请 登录注册

这个操作成功
图片附件: 游客没有浏览图片的权限,请 登录注册

这个操作失败,他们唯一的区别就是第四,五行相差一个字符,求大神指点这是什么歌情况。
一下午就弄成这么个玩意

[ 本帖最后由 yaobao 于 2013-1-1 16:56 编辑 ]

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-01 16:51
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
求指教,求鞭笞,求虐待。。。。。

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-01 16:52
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
  Out_pfile = fopen("F:\\vc\\222.txt","wb");运行到这出错,发表时弄红没成功

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-01 16:55
朱三哥
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:311
专家分:359
注 册:2012-12-11
收藏
得分:0 
别磨蹭这个鸟,这个程序的基本原理是
从二进制文件中读取一个 二进制的数,已它为大小按字符的格式再读取,多少个字符到 缓冲区BUFF里面
很显然是对一个存放数据结构
struct date{
int n;
char str[n];
}
的文件操作
你自己用自己的算法去实现塞,也可以用格式化的函数来操作这个

你们上面的输入是不合法的
要输入一个数字,然后再输入这么多个数字的字符,才符合 要求的

哥,破你无线很难的,不要老是改,少看路由器上的灯,你会死啊
2013-01-01 17:01
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
可我对形成这个现象的原因很好奇

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-01 17:08
朱三哥
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:311
专家分:359
注 册:2012-12-11
收藏
得分:0 
他上面的代码是有错误的,其主要的错误在于

为BUFF 开辟了空间,他却不释放,一直这么开辟下去
运行正常是开辟的空间还能满足除去 数据区和代码区外的其他空间 未超过 2GB的虚拟内存大小

不正常出现你上面的情况是因为 他把一个进程的4GB空间的2GB 用malloc函数给分配干净了,再到 你FOPEN操作的时候,木有空间了

你要知道  4GB的编址 用完后 在往上加的话,就会溢出 变成全0   这个就是你对0X00000000000的错误由来

补充  对堆的操作malloc是从低地址往高地址分配的   操作的是虚拟内存空间

愿神保佑我

哥,破你无线很难的,不要老是改,少看路由器上的灯,你会死啊
2013-01-01 17:09
朱三哥
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:311
专家分:359
注 册:2012-12-11
收藏
得分:0 
回复 28楼 yaobao
宝哥哥 我已经回答了你 错误的来源,可否送我100分

哥,破你无线很难的,不要老是改,少看路由器上的灯,你会死啊
2013-01-01 17:10
快速回复:找到错误了,但不知道为什么出错...好像第一次运行还是对的,总之求教 ...
数据加载中...
 
   



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

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