求助: 网上抄写源代码不知错在何处。
											求助: 网上抄写源代码不知错在何处。网上源代码地址: 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)
ReadFile.cpp
				(3.03 KB)
				
				
			


 
											






 
	    

 
	




