visual studio 2010-关于C语言读入文件后 管理存储字符串的问题(问题未确定)

问题描述

关于C语言读入文件后 管理存储字符串的问题(问题未确定)
vs2010报错是“Windows 已在 公交查询系统.exe 中触发一个断点。

其原因可能是堆被损坏,这说明 公交查询系统.exe 中或它所加载的任何 DLL 中有 Bug。

原因也可能是用户在 公交查询系统.exe 具有焦点时按下了 F12。”
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
long long a;
#define stop system(""pause"");

#define home(x) printf(""%p
""x);
int j;//控制项目数组
struct item
{
int number;
char*Item;
};

int main(int argcchar *argv[])
{
system(""color f9"");
system(""title 公交查询系统"");
FILE *fp;
int i;//线路选择
char c;
c=(char)malloc(sizeof(char));
printf(""字符变量的地址是:"");
home(c);
int amount=0;//交通线路的数量

fp=fopen(""file.txt""rb+"");if(fp==NULL){    printf(""获取失败╮(╯▽╰)╭
"");    system(""pause"");    return 0;}printf(""文件指针的地址是:%p
""fp);//确保文件指针分配到了内存fseek(fp0SEEK_END);int file_size=ftell(fp);//计算文件的大小fseek(fp0SEEK_SET);char *str=NULL;//不知道有没有分配内存str=(char*)malloc(sizeof(*fp));//分配一个文件大小的内存给指针printf(""指针str的地址是:"");home(str);//用C语言宏 确认str指针分配到了地址str[file_size]='';//用空字符结尾 防止字符串乱码fread((void*)strfile_size1fp);//把文件内容读给strprintf(""文件大小:%d
""file_size);//确认文件大小正确 不为零int seek=0;//设置循环变量while(seek<file_size){    if(str[seek]=='.')//检索项 用数组运算符 遇到'.'分为一项    {        amount++;//amount是项目数        static char*one=NULL;//静态变量 作为str的副本╮(╯▽╰)╭        one=(char*)malloc(sizeof(*fp));        static int one_1=1;        static int seek_1=seek;        while(one_1<=seek)         {            sprintf(one%c""str[one_1]);         }    }    seek++;}if((c=getc(fp))!=NULL){    printf(""读入到文件尾!
"");}puts(str);//检查文件内容是否不存在std::cout<<amount<<std::endl;fclose(fp);fp=NULL;struct item ch[5];    {//使自动变量在代码块结尾 退出堆int i=1;char*ch_1=NULL;//存储项的内容ch_1=(char*)malloc(sizeof(char*));printf(""临时字符串的地址:%p
""ch_1);//确保字符串分配到了地址stop;//C语言宏 system(""pause"");while(i<amount){    do{        c=str[a];       sprintf(ch_1%c""c'');    }while(a==1);    std::cout<<ch_1<<""
""<<c<<""
"";//确保临时字符串有内容    ch[j].Item=NULL;    ch[j].Item=(char*)malloc(sizeof(*fp));        printf(""项目的地址:%p
""ch[j].Item);//确保存储项的结构数组中的指针分配到了内存        std::cout<<j<<""
"";//确保下标未越界        stop;    while(ch_1!=""。"")    {        ch[j].number=i;//此时 第一项 用number标识这是第几项        strcat(ch[j].Itemch_1);//把ch_1的内容给连接在指针的末尾        if(c==0)        {            std::cout<<""读取失败
"";            stop;            std::cout<<ch[j].Item<<""
"";            stop;        }        c=str[a];//继续获取文件内容        sprintf(ch_1%c""c);        a++;    }    strcat(ch[j].Item。"");j++;i++;}free(ch_1);    }printf(""1.数据维护(增加项、删除项)
2.查询
3.退出
"");scanf(""%d""&i);switch(i){case 1:    int a;         printf(""你真的做决定了吗?如果你确定的话请选择:
1.增加项
2.退出
"");         scanf(""%d""&a);         if(a==1)         {        fp=fopen(""file.txt""w+"");//以读模式来覆盖文本 方便添加项目        char*add_1=(char*)malloc(sizeof(*fp));        sprintf(add_1%d.""++amount);//add_1存储文件的序号 如当前有5项        char*add_2=(char*)malloc(sizeof(*fp));//add_2是要添加的文本        printf(""在此处添上你要添加的文本
"");        scanf(""%s""add_2);        strcat(add_1add_2);        strcat(add_1。"");        strcat(stradd_1);//把文本添加到末尾        puts(str);        stop;        fprintf(fp
"");        fprintf(fpstr);//确认添加成功        fclose(fp);        fp=NULL;        add_1=add_2=NULL;        free(add_1);        free(add_2);         }    else if(a==2)    {        fp=fopen(""file.txt""w+"");        int d;        printf(""请选择你要删除第几项
"");        scanf(""%d""&d);        ch[d].Item="""";        str="""";        for(j=1;;j++)        {            strcat(strch[j].Item);        }        fprintf(fpstr);        fclose(fp);        fp=NULL;        for(seek=0;seek<amount;seek++)        {            free(ch[seek].Item);        }    }    break;case 2:puts(str);break;case 3:system(""pause"");return 0;break;default:    break;}str=NULL;free(str);system(""pause"");return 0;

}


运行结果在附属的图片中
还请帮忙看看是什么地方出了错误..

解决方案

C++字符串存储问题

解决方案二:
fseek(fp0SEEK_END);
int file_size=ftell(fp);//计算文件的大小
fseek(fp0SEEK_SET);
char str=NULL;//不知道有没有分配内存
str=(char
)malloc(sizeof(*fp));//分配一个

这地方错了,可以按照需要的内存量分配,文件不大的话,
分配file_size 个字节(或者多一个)的就可以了
sizeof(*fp) 分配的内存,为何要和流指针 占用空间有关?

解决方案三:
fseek(fp0SEEK_END);
int file_size=ftell(fp);//计算文件的大小
fseek(fp0SEEK_SET);
char str=NULL;//不知道有没有分配内存
str=(char
)malloc(sizeof(*fp));//分配一个

这地方错了,可以按照需要的内存量分配,文件不大的话,
分配file_size 个字节(或者多一个)的就可以了
sizeof(*fp) 分配的内存,为何要和流指针 占用空间有关?

时间: 2024-11-01 13:40:20

visual studio 2010-关于C语言读入文件后 管理存储字符串的问题(问题未确定)的相关文章

《C++语言入门经典》一1.2 Visual Studio 2010 集成编译环境

1.2 Visual Studio 2010 集成编译环境 C++的开发环境有很多种,例如,常见的Visual C++ 6.0 等.Visual Studio 2010 是微软公司继Visual C++ 6.0 之后新设计的集成开发环境,它更加支持C++标准规范,对新标准--C++0x 提供全面的支持.下面就来介绍它的使用方法. 1.2.1 安装Visual Studio 2010 在安装Visual Studio 2010 之前,首先要了解安装Visual Studio 2010 的必备条件,

用Microsoft visual studio 2010新建C#项目后无法打开

问题描述 用Microsoft visual studio 2010新建C#项目后无法打开 用Microsoft visual studio 2010新建C#项目后无法打开系统提示""不允许所请求的注册表访问权""如何能打开

使用Visual Studio 2010/2013编译V8引擎步骤分享_C 语言

使用Visual Studio 2013编译V8引擎 复制代码 代码如下: 准备工作,安装Python2.x,git,svn: Git: http://msysgit.github.io SVN:http://www.sliksvn.com/en/download Python:https://www.python.org/downloads/ 第一步,获取V8源码: https://github.com/v8/v8-git-mirror 第二步,获取cygwin,放到V8源码下的third_p

《C++ 开发从入门到精通》——1.3 使用Visual Studio 2010

1.3 使用Visual Studio 2010 图片 1 知识点讲解:光盘:视频\PPT讲解(知识点)\第1章\使用Visual Studio 2010.mp4 Visual Studio 2010是微软为适用.NET平台而推出的专用开发工具,它是一个集成的开发环境工具,能够适用Visual Basic.Visual C++.Visual C#等专业编程语言.通过Visual Studio 2010可以在同一项目内使用不同的语言,并能实现它们间的相互无缝接口处理,共同实现指定的功能.使用Vis

《Visual C# 2010入门经典》一书1.3 Visual Studio 2010

1.3 Visual Studio 2010 Visual C# 2010入门经典 Visual Studio是一个功能齐备的集成开发环境(Integrated Development Environment IDE),由众多工具组成.这些工具的目的相同:让您能够创建新颖的下一代应用程序.Visual Studio的核心包括功能强大的代码编辑器.语言编译器(支持Visual Basic.C#和F#)和调试工具.除此之外,Visual Studio还提供了众多其他的功能. 与源代码控制系统集成.

应用Visual Studio 2010辅助敏捷测试(下)

随着需求的不断变化和迭代的深入,代码库不可避免的会有频繁的签入和签出,此时测试人员一项很重要的任务就是要预防回归问题发生.执行手工测试用例可以帮助我们预防及和发现回归问题,但是它的执行效率太低,无法胜任频繁执行的要求.这时就我们需要考虑采用自动化测试用例完成这项工作.决定是否采用自动化测试是有很多因素决定,其中很重要的一条就是自动测试的收益,下面的公式从概念上解释了如何来计算这个收益,当收益值大于1的时候,实施自动化测试就是合算的:否则,就是不合算的. 图1:计算收益公式 这其中,开发和维护自动

Visual Studio 2010 中的代码约定设置

软件约定称为代码约定,通过这一约定可以表示代码正常工作所需的正式条件. 如果方法未按预期收到数据或生成的数据不符合预期的后置条件,代码约定将导致代码引发异常. 有关前置条件和后置条件的概述,您可能需要查看我上个月发表的文章 (msdn.microsoft.com/magazine/gg983479). 代码约定是 .NET Framework 4 的一部分,但同样依赖于 Visual Studio 2010 中的一些功能,例如运行时工具.与 MSBuild 集成以及"项目属性"框中的属

Visual Studio 2010 中的代码“.NET研究”约定设置

软件约定称为代码约定,通过这一约定可以表示代码正常工作所需的正式条件. 如果方法未按预期收到数据或生成的数据不符合预期的后置条件,代码约定将导致代码引发异常. 有关前置条件和后置条件的概述,您可能需要查看我上个月发表的文章 (msdn.microsoft.com/magazine/gg983479). 代码约定是 .NET Framework 4 的一部分,但同样依赖于 Visual Studio 2010 中的一些功能,例如运行时工具.与 MSBuild 集成以及"项目属性"框中的属

Visual Studio 2010“.NET技术” 中的代码约定设置

软件约定称为代码约定,通过这一约定可以表示代码正常工作所需的正式条件. 如果方法未按预期收到数据或生成的数据不符合预期的后置条件,代码约定将导致代码引发异常. 有关前置条件和后置条件的概述,您可能需要查看我上个月发表的文章 (msdn.microsoft.com/magazine/gg983479). 代码约定是 .NET Framework 4 的一部分,但同样依赖于 Visual Studio 2010 中的一些功能,例如运行时工具.与 MSBuild 集成以及"项目属性"框中的属