| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1260 人关注过本帖
标题:求助: 网上抄写源代码不知错在何处。
只看楼主 加入收藏
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:406
专家分:190
注 册:2021-4-9
结帖率:97.26%
收藏
已结贴  问题点数:20 回复次数:10 
求助: 网上抄写源代码不知错在何处。
求助: 网上抄写源代码不知错在何处。

网上源代码地址:  https://blog.

图片附件: 游客没有浏览图片的权限,请 登录注册

问题1: 反复检查,没找到错误。
错误代码也看不懂。


图片附件: 游客没有浏览图片的权限,请 登录注册

问题2:代码从第6行到第9行看不懂!!!
单独的一行#define  宏替换勉强可以看懂。
单独的一行typedef  用户定义类型勉强可以看懂。
用'\'把它们连在一起,里面还有不止一个';'分号。
宏替换末尾没有';'分号。
这几个问题,凑在一起,彻底蒙圈了。。。。

程序代码:
#include<iostream>
#include<locale.h>

#pragma warning(disable:4996)

#define DISALLOW_COPY_AND_ASSIGN(typename)\
private:\
typedef(typename&);\
typename& operator=(typename&);

using namespace std;
typedef unsigned int Uint32;

class File {
public:
    File() { _ptr_file = nullptr; }
    File(const char* fn, const char* opr) {
        open(fn, opr);
    }
    ~File() { close();}
    //读取文件到内存
    static char* read_file(Uint32& size, const char* fn) {
        File tmp_file;
        if (tmp_file.open(fn, "rb")) { return size = 0, nullptr; }
        size = tmp_file.get_file_size();
        char* buf = (char*)malloc(size + 4);///这里多分配几个字节做字符串结尾
        if (!buf) { return size = 0, nullptr; }
        memset(buf, 0, size + 4); ///内存填充0
        size = tmp_file.read_byte(buf, size);
        return buf;
    }
    ///获取文本文件类型
    ///文件类型:utf-8返回0
    /// utf8 bom 返回1
    /// ucs-2 BE大端字节序返回2
    /// USC-2 LE小端字节序返回3
    /// 文件不存在返回 -1
    static int get_file_type(const char* fn) {
        File temp_file;
        if (temp_file.open(fn, "rb")) { return -1; }
        if (temp_file.get_file_size() <= 2) { return 0; }
        char en_buf[3] = { 0 };
        temp_file.read_byte(en_buf, 3);
        if (0 == memcmp(en_buf, "\xEF\xBB\xBF", 3)) { return 1; }
        else if (0 == memcmp(en_buf, "\xFE\xFF", 2)) { return 1; }
        else if (0 == memcmp(en_buf, "\xFF\xFE", 2)) { return 1; }
        return 0;
    }
    int open(const char* fn, const char* opr) {
        close();
        _ptr_file = fopen(fn, opr);
        if (!_ptr_file) { return-1; }
        return 0;
    }
    void close() {
        if (!_ptr_file) { return; }
        fclose((FILE*)_ptr_file);
    }
    ///获取文件大小
    Uint32 get_file_size() {
        int cur_pos = ftell((FILE*)_ptr_file);
        fseek((FILE*)_ptr_file, 0L, SEEK_END);
        Uint32 ret = ftell((FILE*)_ptr_file);
        fseek((FILE*)_ptr_file, cur_pos, SEEK_SET);
        return ret;
    }
    ///读取size个字节到dst///
    Uint32 read_byte(char* dst, Uint32 size) {
        Uint32 min_size = min(size, get_file_size());
        fread(dst, 1, min_size, (FILE*)_ptr_file);
        return min_size;
    }
private:
    void* _ptr_file;
    DISALLOW_COPY_AND_ASSIGN(File)
};

///大端字节序转为小端字节序,当前大部分笔记本和手机都是小端字节序
void big2little(wchar_t* src, Uint32 size) {
    for (Uint32 iix = 0; iix < size; ++iix, ++src) {
        *src = (((*src) & 0xff00) >> 8 | (((*src) & 0x00ff) << 8));
    }
    return;
}

int main() {
    const char* filename = "C:\\Users\\Administrator\\Desktop\\B.txt";
    Uint32 size = 0;
    char* buffer = File::read_file(size, filename);
    if (0 == size && nullptr == buffer) { cout << "文件不存在!!!" << endl; }
    int filetype = File::get_file_type(filename);
    _wsetlocale(LC_ALL, L"chinese");
    switch (filetype) {
    case 0: //utf8编码
        cout << std::string(buffer);
        break;
    case 1: //utf8 bom编码
        cout << std::string(buffer + 3);
        break;
    case 2: //ucs-2 BE
        big2little((wchar_t*)buffer + 1, size / 2 - 1);
        wcout << std::wstring((wchar_t*)buffer + 1);
        break;
    case 3: //ucs-2 LE
        wcout << std::wstring((wchar_t*)buffer + 1);
        break;
    default:
        cout << "文件不存在!!!" << endl;
    }
    free(buffer);
    return 0;
}


ReadFile.cpp (3.03 KB)
搜索更多相关主题的帖子: File size buffer char return 
2022-09-09 13:50
apull
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:三体星系
等 级:版主
威 望:216
帖 子:1479
专家分:9035
注 册:2010-3-16
收藏
得分:7 
程序代码:
宏末尾的\表示还没结束,换行后继续。

这个宏展开如下:
private:
    void* _ptr_file;
    //DISALLOW_COPY_AND_ASSIGN(File)
    //#define DISALLOW_COPY_AND_ASSIGN(File)
private:
    File(File&);
    File& operator=(File&);



还有,你敲错了,不是typedef,是typename。

[此贴子已经被作者于2022-9-9 15:04编辑过]

2022-09-09 15:02
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:406
专家分:190
注 册:2021-4-9
收藏
得分:0 
回复 2楼 apull
是的抄写错了,
昨晚迷迷糊糊,看见了type, 相当然的就想到了typedef,
想到了typedef,迷迷糊糊的眼睛也就看成了typedef。

但是,从第6行到第9行,语法看不懂。
2022-09-09 15:54
yuma
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:银河系
等 级:贵宾
威 望:37
帖 子:1925
专家分:2992
注 册:2009-12-22
收藏
得分:7 
咬西,终于看到了一个玩VS的。

心生万象,万象皆程序!
本人计算机知识网:http://bbs.为防伸手党,本站已停止会员注册。
2022-09-09 15:57
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:406
专家分:190
注 册:2021-4-9
收藏
得分:0 
回复 2楼 apull
头大了,这个程序让ANSI编码中文正常输出了,utf8编码中文又成了乱码。。。
这个程序,不是可以自己识别多种编码吗???

图片附件: 游客没有浏览图片的权限,请 登录注册
2022-09-09 16:17
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:406
专家分:190
注 册:2021-4-9
收藏
得分:0 
回复 4楼 yuma
想地太简单了。。。
这只是一个骗子程序。
所谓的,识别文件编码,只能在知道文件内容的前提下,比对文字头代码。。。。
不知道文件内容的前提下,想知道文件编码,就是天方夜谭。。。
2022-09-09 18:05
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:406
专家分:190
注 册:2021-4-9
收藏
得分:0 
回复 2楼 apull
想地太简单了。。。
这只是一个骗子程序。
所谓的,识别文件编码,只能在知道文件内容的前提下,比对文字头代码。。。。
不知道文件内容的前提下,想知道文件编码,就是天方夜谭。。。
2022-09-09 18:08
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:6 
不知道你的具体要求是什么?
如果没有BOM的话,只能靠猜测。既然是猜测,那自然就可能猜错。Windows自带的notepad.exe也经常因为猜错编码而乱码,这是没办法的事。
Windows建议用ICU(International Components for Unicode),但ICU也猜不准。
最严重的是 gbk没有bom,之前的Windows默认使用gbk,而现在Windows默认使用无bom的utf8。

BTW: 在网上搜索时,输入关键字后,加上 -csdn 就可以略过包含csdn的页面。(注意前面的减号)
当然,如果你就说喜欢csdn的话,当我没说。
2022-09-09 19:42
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:406
专家分:190
注 册:2021-4-9
收藏
得分:0 
回复 8楼 rjsp
是我的理论基础太少,总把问题想地太简单了。。。
折腾了俩天,发现,自动识别,文件编码,是天方夜谭。。。。


[此贴子已经被作者于2022-9-9 21:46编辑过]

2022-09-09 21:40
追梦人zmrghy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:406
专家分:190
注 册:2021-4-9
收藏
得分:0 
回复 8楼 rjsp
难怪乱码,刚从winhex里面看UTF-8无BOM编码情况下,“TMD”一个汉字占3个字节,24位
ANSI编码时要使用对应的 页代码,简体中文 对应的页代码为936 也就是GBK。

以前,只要一听字符/汉字 编码。就像听催眠曲一样。
今天,在winhex里面一看,就全明白了。。。


[此贴子已经被作者于2022-9-10 01:27编辑过]

2022-09-10 01:21
快速回复:求助: 网上抄写源代码不知错在何处。
数据加载中...
 
   



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

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