标题:c++读取文件栈溢出,麻烦各位帮我看看什么原因
只看楼主
mj0011
Rank: 2
等 级:论坛游民
帖 子:24
专家分:39
注 册:2014-12-23
结帖率:100%
已结贴  问题点数:1 回复次数:2 
c++读取文件栈溢出,麻烦各位帮我看看什么原因
程序代码:
#include <fstream>
#include <iostream>

using namespace std;

void enCode(char *buf, int size) {
    for (int index = 0; index <= size; ++index)
        ++(*buf++);
}

void dnCode(char *buf, int size) {
    for (int index = 0; index <= size; ++index)
        --(*buf++);
}

int main(int argc, char **argv)
{
    if (argc != 3|| strcmp(argv[1] ,"-e") && strcmp(argv[1] ,"-d") )
    {
        cout << "program name : -e|-d :filename" << endl;
        return 1;
    }

    fstream fin(argv[2], ios::binary | ios::in | ios::out);
    
    if (!fin) {
        cout << "读取文件错误"  << endl;
        return 2;
    }

    char buf[100];

    int pos1 = 0, pos2 = 0 ,bytes;
    void(*p)(char *, int) = argv[1][1] == 'e' ? enCode : dnCode;
    bool ok = true;
    while (ok) {
        fin.seekg(pos1);
        fin.read(buf, sizeof(buf));
        if (!fin) {
            fin.clear();
            ok = false;
        }
        else
            pos2 = fin.tellg();

        bytes = fin.gcount();
        p(buf, bytes);

        fin.seekp(pos1);
        fin.write(buf, fin.gcount());
        
        pos1 = pos2;

        
    }
    
    return 0;
}

把char buf[100]改成char buf[10000]就不会出现错误了,这是什么原因,我看陈宗权视屏中他改成100没有出现错误
搜索更多相关主题的帖子: 原因 char int size index 
2018-07-19 16:12
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:1 
你不给 运行参数 和 文件内容 的话,让别人怎么测试?
------------
从代码上,一开始 for (int index = 0; index <= size; ++index) 看起来就挺恶心的(这种“恶心”当你代码写多了就自然形成了)
我猜你想要的是 for( int index=0; index<size; ++index )

当然,用int作下标的都是无可救药的外行,不知道具符号整型的溢出属于未定义行为的属于新手,那正确的写法是
void enCode( char* buf, size_t size )
{
    for( size_t i=0; i!=size; ++i )
        ++((unsigned char*)buf)[i];
}
2018-07-19 17:05
mj0011
Rank: 2
等 级:论坛游民
帖 子:24
专家分:39
注 册:2014-12-23
得分:0 
回复 2楼 rjsp
谢谢你的回复,是你说的这个原因,现在改完后代码已经没有问题了,关于你说的<= ,下次写代码会注意
2018-07-19 17:10



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-488694-1-1.html




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

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