Frost Moon Project

WriteConsole()で長い文字列を渡すと表示されない場合の対処法 - Frost Moon Project アクセスランキング

Home > Tips > WriteConsole()で長い文字列を渡すと表示されない場合の対処法

WriteConsole()で長い文字列を渡すと表示されない場合の対処法

  1. 問題
  2. 解決方法

問題
WriteConsole()で長い文字列を渡すと、一文字も表示されません。
writeconsole_large_buffer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#define WIN32_LEAN_AND_MEAN
 
#define UNICODE
#define _UNICODE
 
#include<tchar.h>
#include<windows.h>
#include<locale.h>
#include<string>
 
typedef std::basic_string<TCHAR>tstring;
 
bool write(const VOID *buffer,DWORD buffer_size,LPDWORD written_chars){
    return WriteConsole(::GetStdHandle(STD_OUTPUT_HANDLE),buffer,buffer_size,written_chars,NULL);
}
 
int main(){
    _tsetlocale(LC_ALL,_tsetlocale(LC_CTYPE,_T("")));
 
    TCHAR rain[]=_T("   /     /     /  //    /  /  / /        /     /        /  /");
    tstring msg(rain);
 
    for(size_t i=0;i<600;++i){
        msg.append(rain);
    }
 
    DWORD written_chars=0;
 
    write(msg.c_str(),msg.length(),&written_chars);
 
    if(written_chars!=msg.length()){
        _tprintf(_T("\n鹿グモで停止中"));
    }else{
        _tprintf(_T("\n雨ダイヤ実施中"));
    }
}
 
        


解決方法
長い文字列を適当に分割してWriteConsole()に渡しましょう。
writeconsole_large_buffer_fix.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#define WIN32_LEAN_AND_MEAN
 
#define UNICODE
#define _UNICODE
 
#include<tchar.h>
#include<windows.h>
#include<locale.h>
#include<string>
 
typedef std::basic_string<TCHAR>tstring;
 
bool write(const VOID *buffer,DWORD buffer_size,LPDWORD written_chars){
    bool result=false;
    DWORD written=0;
    const DWORD write_buffer_size=2048;
 
    //分割して出力
    const TCHAR* ptr=static_cast<const TCHAR*>(buffer);
    const TCHAR* end=ptr+lstrlen(static_cast<const TCHAR*>(buffer));
 
    for(DWORD write_size=write_buffer_size;ptr<end;ptr+=written){
        if(write_size>static_cast<DWORD>(end-ptr))write_size=end-ptr;
 
        result=::WriteConsole(::GetStdHandle(STD_OUTPUT_HANDLE),ptr,write_size,&written,NULL);
    }
 
    if(written_chars)*written_chars=ptr-static_cast<const TCHAR*>(buffer);
    return result;
}
 
int main(){
    _tsetlocale(LC_ALL,_tsetlocale(LC_CTYPE,_T("")));
 
    TCHAR rain[]=_T("   /     /     /  //    /  /  / /        /     /        /  /");
    tstring msg(rain);
 
    for(size_t i=0;i<600;++i){
        msg.append(rain);
    }
 
    DWORD written_chars=0;
 
    write(msg.c_str(),msg.length(),&written_chars);
 
    if(written_chars!=msg.length()){
        _tprintf(_T("\n鹿グモで停止中"));
    }else{
        _tprintf(_T("\n雨ダイヤ実施中"));
    }
}
        

無事表示させることが出来ました。


Copyright(C) 2007-2025 Frost Moon Project


Home > Tips > WriteConsole()で長い文字列を渡すと表示されない場合の対処法