很杂碎的一些问题,自己给自己汇总

时间:2022-05-07 16:28:40

一:出现那些warning的提示的话,就是提示你这某些比较古老的函数,可能会导致不安全的因素,就在那个文件的头加一个这个:

#define _CRT_SECURE_NO_DEPRECATE

 

二:关于用ofstream来写文件,可以这样的:

    string append_file_string = "I:/test_append.txt";
    char temp_append[30] = "";
    for (int i =0 ; i < 30; i++)
        temp_append[i] = 'a' + i;
    string append_char = "Always in the rainy they took the discretion my liberty";
    ofstream append_file(append_file_string.c_str(), ios::app | ios::binary);
    append_file.write(append_char.c_str(), append_char.size());
    append_file << "\r\n" << append_char;

用write和 << 都可以,看起来第二种方式可爱好用多了,和cin一样理解,其实cin也是一个流,只不过默认的终端是键盘,而ofstream接受的就是来自于程序里面的字符串或者是字符数组的输入,这里要记住一个问题,当用write的时候如果传入的是一个string.c_str,那么后面别用sizeof(),那个是给buffer用的,这个时候要用是string.size()或者length(),否则就出问题了,我也不知道为什么呢。

 

第三:正在苦恼着文件传输的问题,因为默认的buffer最大只能64k,然后貌似要用boost里面也包装好的windows的transmit file,然后貌似又跌跌撞撞到了overlapped io这个内容上,然后发现这个博客说的东西貌似挺全,反正也要补充下基础的,记录下吧:http://blog.csdn.net/arau_sh/rss/list  , 还有这个:http://blog.csdn.net/piggyxp/article/details/6922277#

 

第四:上面的博客,这段话,先记录下:

关于完成端口通知的次序问题

        这个不用想也能知道,调用GetQueuedCompletionStatus() 获取I/O完成端口请求的时候,肯定是用先入先出的方式来进行的。

        但是,咱们大家可能都想不到的是,唤醒那些调用了GetQueuedCompletionStatus()的线程是以后入先出的方式来进行的。

        比如有4个线程在等待,如果出现了一个已经完成的I/O项,那么是最后一个调用GetQueuedCompletionStatus()的线程会被唤醒。平常这个次序倒是不重要,但是在对数据包顺序有要求的时候,比如传送大块数据的时候,是需要注意下这个先后次序的。

        -- 微软之所以这么做,那当然是有道理的,这样如果反复只有一个I/O操作而不是多个操作完成的话,内核就只需要唤醒同一个线程就可以了,而不需要轮着唤醒多个线程,节约了资源,而且可以把其他长时间睡眠的线程换出内存,提到资源利用率。

 

第五:在调试程序的时候,一直在提示我stack overflow,我真心不知道是什么问题,因为设置了好多输出的语句,发现都还没开始执行到那里呢就报错了,到底什么跟什么啊,好吧,后来发现我傻逼了,设置了这么一个数组 :char buf[1024*1024],原来这么大是不行的,最基本的堆栈的问题我都忘记了,呵呵,好吧,用堆来在程序中手动分配空间吧,用指针,malloc,搞定了的。

 

 第六:如下的代码可以给socket设置一些option,不过注意,一定要放在connect了之后,额,我也不知道为什么,如何设置放在connect之前的话就会弹出句柄无效的错误:

            //Initiate a new socket and set it's receive buffer size
            
            tcp::socket boost_socket(io_service);
            boost::asio::connect(boost_socket, endpoint_iterator);

            boost::asio::socket_base::receive_buffer_size option(RECEIVE_BUFFER_SIZE);
            boost_socket.set_option(option);

 

第七,发现c++里面的字符串拼接真心不方便啊!要么用 += 要么用append之类的,怎么就不能像python那么爽呢!直接用+号在一行代码里面就可以搞定了!哎,也没办法了,写这条的话主要是因为貌似看到有人做过实验对比四种不同的拼接方法,然后是 += 效率最高,好吧,就这样吧

 

第八:关于c++ 的string,不要再用 string == NULL 这样傻逼的东西了,因为string本来就是一个对象了不不可能为空了,null是跟指针搞在一起的,然后需要给一个空值的话就给个 “”,就可以了,然后判断的话用的是 string.empty()。