| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2084 人关注过本帖
标题:找到错误了,但不知道为什么出错...好像第一次运行还是对的,总之求教啦...
只看楼主 加入收藏
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
...等下给你二十分抚恤金啊...

刚刚把练习全做完了,就这一道了,其实这一道原理上跟其他练习题相比十分简单,但不知怎的出了这个坑爹滴错误,打开文件出错最多返回NULL啊,咋直接就给崩溃了捏...
字符串少点还可以运行,超过三个就死机了,但这和打开文件又有神马关系捏...
  尼玛!!!

I have not failed completely
2013-01-01 13:23
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
看你9楼的pp
明显是内存溢出 系统崩溃  还是有死循环的存在

DO IT YOURSELF !
2013-01-01 13:42
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
但是字符串少于4个就不会出错,而出错的地方在打开文件的地方,可我打开的是另一个完全没有使用过的文件

这两者根本就没有联系啊?
程序代码:
 printf("\nEE\n");
    if(!(Out_pfile = fopen(Out_filename, "wb")))     /* 在这里出错了,运行到这里会出警告,可应该没错啊? */
    {
        printf("error!\n");
        return -1;
    }
    printf("\nEE\n");

而且前面我也检查过,buffer已经顺利的读入了Input_pfile中的所有数据
看你9楼的pp
明显是内存溢出 系统崩溃  还是有死循环的存在
如果是这样的话有没有什么办法改正呢?主要是我还是想不懂我哪错了...
希望万版帮我改下,谢谢

如果真的解决了这个坑爹的问题我一定要曝个百分贴来感谢你们



I have not failed completely
2013-01-01 14:21
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
fread(&length, sizeof(size_t), 1, Input_pfile);

授人以渔,不授人以鱼。
2013-01-01 14:49
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
两位版主,他的代码是要两段合一起看的,全代码是这样的
程序代码:
#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;

    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");   /* 在这里出错了,运行到这里会出警告,可应该没错啊? */

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

合一起之后确实出现了楼主所说的情况,我弄了很久,在调试时监视显示是 Out_pfile = fopen("F:\\vc\\222.txt","wb");这句存在指针错误引用0x00000000地址,不明白是怎么回事,我甚至想要用另外的代码实现fopen的实现过程,可是本事不够,没能成功,我也试过将这句之后的代码全部注释掉,也取消这句的赋值过程,只打开文件,还是出现指针错误。
费解啊。。。。。

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-01 15:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
回复 15楼 yaobao
你分步调试看看。那行的语句会出错吗?到那行的时候,他内存可能已经极度混乱了,无法执行下去而已。砍掉后面的代码,单调试前面那些,就能找到原因。

授人以渔,不授人以鱼。
2013-01-01 15:22
朱三哥
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:311
专家分:359
注 册:2012-12-11
收藏
得分:10 
if( jilu < (int)length)
        {
            jilu = length;
            temp = buffer;
            free(temp);      -----------》free 掉 temp 上面的TEMP=BUFFER是干什么用的,再就是temp 是初始化过的静态数据 不是放在堆里面的 怎么个free法呀,下面又给这个temp护值为NULL,这个就无法理解了
            temp = NULL;
            buffer = (char*)malloc(length+1);
        }
这段代码怎么那么古怪呢
按我的理解,内存管理函数主要是针对堆区的数据的,也就是声明了,但是没有分配空间的

在一个程序中 数据被编译器分成好几个内型的
1.初始化过的变量        
2.常量区 (立即数)
3.未被初始化过的变量
4.声明但未分配内存空间的变量


[ 本帖最后由 朱三哥 于 2013-1-1 15:48 编辑 ]

哥,破你无线很难的,不要老是改,少看路由器上的灯,你会死啊
2013-01-01 15:38
朱三哥
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:311
专家分:359
注 册:2012-12-11
收藏
得分:0 
fread(&length, sizeof(size_t), 1, Input_pfile);
这个代码也存在问题呀   size_t应该是个int型的,你读4个字节的数据放在一个char类型的数据2个字节里面,敢问这个是要干什么呢。说白了它是会覆盖掉你后面的数据的
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;
看到没 length 后面的 int jilu的前两个字节的内容会被这次的操作给覆盖掉



你这样的错误叫 计算机的语义模糊


哥,破你无线很难的,不要老是改,少看路由器上的灯,你会死啊
2013-01-01 15:43
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
三哥威武 膜拜三哥
下次投版主票 投三哥

DO IT YOURSELF !
2013-01-01 15:45
朱三哥
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:311
专家分:359
注 册:2012-12-11
收藏
得分:0 
见笑了。手头上没有VC 不然编译了,反汇编看看问题出哪了

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



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

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