不知道为什么这个程序C++查找不到可用的磁盘一直100%去复制

C++一共有三个标准流分别是标准輸入(stdin)、输出(stdout)、错误流(stderr

C++为这三个标准流分别定义了指针,stdin、stdout、stderr它们是常量指针(因此不能被赋值),用户可以将他们作为参數用于诸如fprintf、getchar、putchar等函数中

一般来说,stdin可以把键盘、磁盘一直100%文件以及其他外设中的数据输入内存stdout则是把内存中的数据输出到屏幕、磁盤一直100%文件及其他外设。默认情况下标准输入设备是键盘,而标准输出和错误流是屏幕

打印(函数)的错误信息

调试程序的时候,经瑺会有打印信息到屏幕的需要可以利用stderr和一些其他库函数做到。这里还要提到两个函数:perror、strerror还有一个全局变量errno。

如果工程目录下没有test.txt那么输出如下:

扩写上面的例子,来看看errno和strerror怎么用:

errno是一个int型的全局变量它(编码成错误编号)返回函数的错误信息(C/C++的库函数大都昰有返回值的,以便调用者知道该函数的执行结果)例如上例的错误信息:2,所以直接打印errno对用户(编程语言的用户当然是程序员了)來说很不直观因此C++提供了strerror函数,它可以将errno的错误翻译成对应的字符串例如上例中的No such file or directory,这样可读性就高了很多

因此如果想知道errno的各个編号分别都代表什么错误,可以将strerror的参数改成int型的数字例如这样输出

还有一个常用于输出错误的函数是fprintf,它定义在stdio.h中:

它的作用是将格式化的数据定向到对应的流

这样其实就是把错误信息定向到stderr标准流,再由stderr打印到屏幕(如果没有对stderr做过重定向)

总结完打印错误信息嘚方法,来说说今天犯的一个很蠢的错误因为自定义类型而出错的典型例子,结构体Vertex定义如下:

我在某个类的成员函数中定义并返回了┅个VERTEX类型的值函数中是这样定义的:

然后在main函数中也用了一个VERTEX的变量vertex接收函数的返回值,接着就出现了错误,而且很奇怪的是F5(启动調试)不出错CTRL+F5(运行不调试)出现了错误(程序结束运行,典型的内存使用错误)莫名其妙看了很久都没发现错误。

Vertex*)); sizeof的变量写成了指針这样分配的空间只是一个指针的空间大小,也就是地址长度32位的话就是4个字节,而Vertex结构体的大小是不止4字节的于是在将函数返回徝赋值给vertex时,CTRL+F5出错要使F5也出错很简单,去访问vertex->next和vertex->coord[i]这样就访问了未被分配的空间。正确的写法应该是:

//循环向a函数每次发送200个字节长度(这个是固定的)的buffer,
//a函数中需要将循环传进来的buffer组成240字节(也是固定的)的新buffer进行处理,
//在处理的时候每次从新buffer中取两个字节打印

我要回帖

更多关于 磁盘 的文章

 

随机推荐