C语言清空输入缓冲区的N种方法对比时间_第1页
C语言清空输入缓冲区的N种方法对比时间_第2页
C语言清空输入缓冲区的N种方法对比时间_第3页
C语言清空输入缓冲区的N种方法对比时间_第4页
C语言清空输入缓冲区的N种方法对比时间_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言清空输入缓冲区的N种方法对比时间:2010-04-20 10:57:36来源:网络 作者:未知 点击:295次 C语言中有几个基本输入函数:C语言中有几个基本输入函数:/获取字符系列int fgetc(FILE *stream);int getc(FILE *stream);int getchar(void); /获取行系列char *fgets(char * restrict s, int n, FILE * restrict stream);char *gets(char *s);/可能导致溢出,用fgets代替之。 /格式化输入系列int fscanf(FILE * restric

2、t stream, const char * restrict format, );int scanf(const char * restrict format, );int sscanf(const char * restrict str, const char * restrict format, );这里仅讨论输入函数在标准输入(stdin)情况下的使用。纵观上述各输入函数,获取字符系列的的前三个函数fgetc、getc、getchar。以getchar为例,将在stdin缓冲区为空时,等待输入,直到回车换行时函数返回。若stdin缓冲区不为空,getchar直接返回。getchar返回

3、时从缓冲区中取出一个字符,并将其转换为int,返回此int值。 MINGW 4.4.3中FILE结构体源码:typedef struct _iobufchar*_ptr;/指向当前缓冲区读取位置int_cnt;/缓冲区中剩余数据长度char*_base;int_flag;int_file;int_charbuf;int_bufsiz;char*_tmpfname; FILE;各编译器实现可能不一样,这里获取字符系列函数只用到_ptr和_cnt。MINGW 4.4.3中getchar()实现:_CRT_INLINE int _cdecl _MINGW_NOTHROW getchar (void)

4、 return (-stdin->_cnt >= 0) ? (int) (unsigned char) *stdin->_ptr+ : _filbuf (stdin);其中stdin为FILE指针类型,在MINGW 4.4.3中,getc()和getchar()实现为内联函数,fgetc()实现为函数。顺便说一句,C99标准中已经加入对内联函数的支持了。获取行系列的fgets和gets,其中由于gets无法确定缓冲区大小,常导致溢出情况,这里不推荐也不讨论gets函数。对于fgets函数,每次敲入回车,fgets即返回。fgets成功返回时,将输入缓冲区中的数据连换行符 一起

5、拷贝到第一个参数所指向的空间中。若输入数据超过缓冲区长度,fgets会截取数据到前n-1(n为fgets第二个参数,为第一个参数指向空间的长度),然后在末尾加入 。因此fgets是安全的。通常用fgets(buf, BUF_LEN, stdin);代替gets(buf);。 格式化输入系列中,fscanf从文件流进行格式化输入很不好用。常用的还是scanf,格式化输入系列函数舍去输入数据(根据函数不同可能是标准输入也可能是字符串输入,如:sscanf)前的空白字符(空格、制表符、换行符)直至遇到非空白字符,然后根据格式参数尝试对非空白字符及后续字符进行解析。该系列函数返回成功解析赋值的变量数,

6、若遇文件尾或错误,返回EOF。 =分 割 线=提到缓冲区,就不得不提setbuf和setvbuf两个缓冲区设置函数,其声明如下:void setbuf(FILE * restrict stream, char * restrict buf);int setvbuf(FILE * restrict stream, char * restrict buf, int mode, size_t size);setvbuf的mode参数有:_IOFBF(满缓冲):缓冲区空时读入数据;缓冲区满时向流写入数据。 _IOLBF(行缓冲):每次从流读入一行数据或向流写入数据。如:stdio,stdout _IO

7、NBF(无缓冲):直接从流读入数据,或者直接向流写入数据,而没有缓冲区。如:stderr setbuf(stream, buf);在:buf = NULL:等价于(void)setvbuf(stream, NULL, _IONBF, 0); buf指向长度为BUFSIZ的缓冲区:等价于(void)setvbuf(stream, buf, _IOFBF, BUFSIZ); 注:BUFSIZ宏在stdio.h中定义。 这里还要提一下传说中的setbuf的经典错误,在C陷阱和缺陷上有提到:int main() int c; char bufBUFSIZ; setbuf(stdout,buf); wh

8、ile(c = getchar() != EOF) putchar(c); return 0;问题是这样的:程序交回控制给操作系统之前C运行库必须进行清理工作,其中一部分是刷新输出缓冲,但是此时main函数已经运行完毕,buf缓冲区作用域在main函数中,此时buf字符数组已经释放,导致输出诡异乱码。解决方案:可以将buf设置为static,或者全局变量,或者调用malloc来动态申请内存。=分 割 线=下面来看看几种流行的缓冲区清空方法:fflush(stdin);式 由C99标准文档中:If stream points to an output stream or an update st

9、ream in which the most recentoperation was not input, the fflush function causes any unwritten data for that streamto be delivered to the host environment to be written to the le; otherwise, the behavior isundened.可以看出fflush对输入流为参数的行为并未定义。但由MSDN上的fflush定义:If the file associated with stream is open f

10、or output, fflush writes to that file the contents of the buffer associated with the stream. If the stream is open for input, fflush clears the contents of the buffer. 可以看出fflush(stdin)在VC上还是有效地!鉴于各编译器对fflush的未定义行为实现不一样,不推荐使用fflush(stdin)刷新输入缓冲区。setbuf(stdin, NULL);式 由前面对setbuf函数的介绍,可以得知,setbuf(stdi

11、n, NULL);是使stdin输入流由默认缓冲区转为无缓冲区。都没有缓冲区了,当然缓冲区数据残留问题会解决。但这并不是我们想要的。scanf("%* ");式(C语言程序设计 现代方法 第二版中提到) 这里用到了scanf格式化符中的“*”,即赋值屏蔽;“%集合”,匹配不在集合中的任意字符序列。这也带来个问题,缓冲区中的换行符 会留下来,需要额外操作来单独丢弃换行符。经典式 int c;while(c = getchar() != '' && c != EOF);由代码知,不停地使用getchar()获取缓冲区中字符,直到获取的字符c是换行

12、符 或者是文件结尾符EOF为止。这个方法可以完美清除输入缓冲区,并且具备可移植性。 本篇文章来源于:开发学院 原文链接:来源:urlc语言: 清空键盘输入缓冲区 一个移植性不那么好但却最简单的方法,是fflush(stdin); 对stdin使用fflush是未定义的行为,不同的系统可能会有不同的结果。 第二种:while(getchar() != 'n');这个代码多点,但最可靠。 C+: cin.sync(); 汇编: /PS:这个我自己没测试 query: ;清空键盘缓冲区 mov ah,1 ;查询键盘缓冲区 int 16h jz empty ;缓冲区为空 xor ax,

13、ax ;不为空则取出,清空 int 16h jmp query empty: ;清空后别的指令 <!-详细出处参考:清空输入缓冲区的方法LINUX-API 2009-10-30 16:22:02 阅读77 评论0 字号:大中小 清空缓冲区的方法 1输入输出缓冲区的概念(C+用的多一些)    我想以一个例子说明,比如我想把一篇文章以字符序列的方式输出到计算机显示器屏幕上,那么我的程序内存作为数据源而显示器驱动程序作为数据目标,如果数据源直接对数据目标发送数据的话。数据目标获得第一个字符,便将它显示。然后从端口读取下一个字符,可是这时就不能保证数据源向端口发送

14、的恰好是第二个字符(也许是第三个,而第二个已经在数据目标显示时发送过了)。这样的话就不能保证输出的数据能完整的被数据目标所接受并处理。      为了解决这个问题,我们需要在数据源与数据目标中间放置一个保存完整数据内容的区域,那就是 “缓冲区”。这样的话,数据源可以不考虑数据目标正在处理哪部分数据,只要把数据输出到缓冲区就可以了,数据目标也可以不考虑数据源的发送频率,只是从缓冲区中依次取出下一个数据。从而保证了数据发送的完整性,同时也提高了程序的效率。     当然getch(),getche()没有用到

15、缓冲区。2几个函数的区别    首先不要忘了,要用getch()必须引入头文件conio.h,以前学C语言的时候,我们总喜欢用在程序的末尾加上它,利用它来实现程序运行完了暂停不退出的效果。如果不加这句话,在TC2.0的环境中我们用Ctrl+F9编译并运行后,程序一运行完了就退回到TC环境中,我们根本来不及看到结果,这时要看结果,我们就要按Alt+F5回到DOS环境中去看结果,这很麻烦。而如果在程序的结尾加上一行getch();语句,我们就可以省掉会DOS看结果这个步骤,因为程序运行完了并不退出,而是在程序最后把屏幕停住了,按任意键才退回到TC环境中去。 

16、   那我们来看看getch()到底起的什么作用,getch()实际是一个输入命令,作用是从键盘接收一个字符,而且并不把这个字符显示出来,就是说,你按了一个键后它并不在屏幕上显示你按的什么,而继续运行后面的代码,所以我们在C+中可以用它来实现“按任意键继续”的效果,即程序中遇到getch ();这行语句,它就会把程序暂停下来,等你按任意键,它接收了这个字符键后再继续执行后面的代码。    你也许会问,为什么我们在C+中就没有在程序的末尾加上getch(),解释是,软件总是不断更新的,不好的地方当然要进行改正,getch()加在程序末尾,它又不赋

17、值给任何变量,所以它在这个地方完全是垃圾代码,与程序无关。C+中考虑到这一点,于是在每次程序运行完了并不退出,而是自动把屏幕停下来,并显示“press any key.”叫你按任意键退出,这就好比C+在它的环境中运行程序,在程序的末尾自动加上了一行getch();语句,并且在这行语句前还添加了一行输出语句cout<<"press any key."来提示你程序结束了,按任意键继续。    实际上我们编译好的程序在程序结束了本身是不会停下来的,我们可以在编译产生的Debug目录中找到这个编译好的应用程序(扩展名exe),在文件夹中双击

18、运行它,你会发现屏幕闪了一下MS-DOS窗口就关闭了,因为程序运行完就自动退出了,回到了windows环境,当然,如果我们在DOS环境中运行这个程序,我们就可以直接在看到DOS屏幕上看到程序运行结果,因为程序运行完后并不清屏。但是,visual 2003有返回到了tc那样的情况,你必需要有个getch()才行。    getche()和getch()很相似,它也需要引入头文件conio.h,那它们之间的区别又在哪里呢?不同之处就在于getch()无返回显示,getche()有返回显示。就这么一点看看下面的例子:DE>#include<stdio.h&g

19、t;#include<conio.h>void main()    char ch;    for(int i=0;i<5;i+)            ch=getch();        printf("%c",ch);    DE>

20、;首先这是个连续5次的循环来实现5次停顿,等待我们输入,我们编译并运行这个程序,假设我们分别输入abcde,屏幕上显示的结果是abcde,这个 abcde并不是在ch=getch();中输出的,我们把printf("%c",ch);这行语句去掉,就会发现我们按5次任意键程序就结束了,但屏幕上什么都没有显示。    然后我们在把代码中的getch()换成getche()看看有什么不同,我们还是分别输入abcde,这时屏幕上显示的结果是aabbccddee,我们把printf("%c",ch);这行语句再去掉看看,显示的结果就是

21、abcde了,说明程序在执行ch=getche();这条语句的时候就把我们输入的键返回显示在屏幕上,有无回显就是它们的唯一区别。    有人会说,既然是C的函数库中的,那么就应该淘汰了,我们还研究它,还用它干嘛?但是我发现还是有用着它的地方,否则我也不会在这里说这么多来耽误大家的时间。我就举个例子吧,程序如下:DE>#include<stdio.h>#include<conio.h>void main()    char ch='*'    

22、;while(ch='*')            printf("n按 * 继续循环,按其他键退出!");        ch=getch();        printf("n退出程序!");DE>我们可以在这个循环体中添加我们想要的功能,程序中按*继续

23、循环,其他任意键退出,而且利用getch()无回显的特性,我们不管按什么,都不会在屏幕上留下痕迹,使我们的界面达到美观效果,如果还有更好的办法实现这个功能。例子:DE>void main()     char c, ch;    c=getch(); /*从键盘上读入一个字符不回显送给字符变量c*/    putchar(c); /*输出该字符*/    ch=getche(); /*从键盘上带回显的读入一个字符送给字符变量ch*

24、/    putchar(ch);    printf("nn");DE>值得注意的是前面两个函数都是从键盘读入数据!还有getchar是很值得研究的:getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了。而getch()和getche()是conio.h中的库函数,它的作用是从键盘接收字符。getchar带有显示。与前面两个函数的区别在于: getchar()函数等待输入直到按回车才结束(前提是

25、缓冲区没有数据),回车前的所有输入字符都会逐个显示在屏幕上。但只有第一个字符作为函数的返回值。DE>#include<stdio.h>#include<conio.h>void main()    char c;    c=getchar(); /*从键盘读入字符直到回车结束*/           /getchar()在这里它只返回你输入字符串的第一个字符,并把返回值赋值给c

26、    putchar(c); /*显示输入的第一个字符*/    printf("nn");DE>    例四:呵呵,这个程序你运行一下,相信你又会有疑问了。这个就是从缓冲区中读取了例子。第一次getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取了。DE>#include<stdio.h>#include<conio.h>void main() 

27、60;  char c;    while (c=getchar()!='n') /*每个getchar()依次读入一个字符*/        printf("%c",c); /*按照原样输出*/    printf("nn");DE>程序运行时,首先停下来,等你输入一串字符串,输入完毕后,它把你输入的整个字符串都输出来了,咦,你不是说getchar()只

28、返回第一个字符么,这里怎么?因为我们输入的字符串并不是取了第一个字符就把剩下的字符串丢掉了,它还在我们的内存中,就好比,开闸放水,我们把水放到闸里去以后,开一次闸就放掉一点,开一次就放掉一点,直到放光了为止,这里开闸动作就相当于调用一次getchar()。我们输入的字符串也是这么一回事,首先我们输入的字符串是放在内存的缓冲区中的,我们调用一次getchar()就把缓冲区中里出口最近的一个字符输出,也就是最前面的一个字符输出,输出后,就把它释放掉了,但后面还有字符串,所以我们就用循环把最前面的一个字符一个个的在内存中释放掉,直到不满足循环条件退出为止。例子中循环条件里的'n'实际

29、上就是你输入字符串后的回车符,所以意思就是说,直到遇到回车符才结束循环,而getchar()函数就是等待输入(或缓冲区中的数据)直到按回车才结束,所以实现了整个字符串的输出。当然,我们也可以把循环条件改一下,比如while (c=getchar()!='a'),什么意思呢,意思就是遇到字符'a'就停止循环,当然意思是如果你输入“12345a213123n”那么只会输出到a,结果是12345a。再次注意:用getchar()它是从“流”中间去读取,所以第一个getchar()接受的是刚刚中断的流队列中即将出列的第一个字符(不限于回车符,上面举过例子了),如果流队列

30、不为空,执行getchar()就继续放水,直到把回车符也放空为止,空了之后再在执行getchar()就停下等待你的输入了;我们用getch()为什么每次都是等待用户的输入呢?因为getch()是从键盘接收,即时的接收,并不是从stdin流中去读取数据。补充:按键盘上的回车产生了2个字符:回车符('r')和换行符('n')。回车符'r'(CR:carriage return:倒车)使光标回到这行的首部,换行符('n')(new line)然后再换行。所以当输入字符'w',并按下回车键以后。首先得到回车符。那个getc

31、har函数结束了。但是还存在一个换行符。所以如果用getchar()来做判断的时候。最好再写一次getchar()清除缓冲区的'n'.3如何清空输入缓冲区的内容?如果我想让getchar()每次都能够等待用户输入的话就要清空缓冲区,下面就介绍方法(不同平台)C 标准规定 fflush()函数是用来刷新输出(stdout)缓存的。对于输入(stdin),它是没有定义的。但是有些编译器也定义了 fflush( stdin )的实现,比如微软的VC。其它编译器是否也定义了 fflush( stdin )的实现应当查找它的手册。GCC编译器没有定义它的实现,所以不能使用 fflush(

32、 stdin )来刷新输入缓存。对于没有定义 fflush( stdin )的编译器,可以使用 fgets()函数来代替它(比用 getchar()、scanf()等函数通用性好)。可以这样忽略输入流中留下的回车等其它输入,从而使下一次的输入总保持一个“干净”的状态。(这个是任何平台下都可以的)/ .char sbuf1024;/ .fgets( sbuf, 1024, stdin );/ .在windows 的vc下面就可以这样了:for(int i=0;i<10;+i)    char ch=getchar();    ff

33、lush(stdin); /每次都会有等待状态了4总结主要看getch(),getche()的是否显示,getchar()是读取流,而且和前面两个函数不是一个库。掌握清空缓冲区的方法。二。fflush(   FILE   *   pStream   )     清空一个流    pStream可以是stdin, stdout, stderr, stdprn, stdaux  flushall()     清

34、空所有流     需要包含   stdio.h三。DE>int n;int ret;do     printf( "Input an integer: " );    ret = scanf( "%d", &n );    while ( getchar() != 'n' ); /* Clear the input buffer */ while ( ret

35、 != 1 );/* 执行这一段函数 */DE>当用户如果输入一个数字的时候,那么这个时候n定义的是一个整型就将这个整型接收ret = scanf( "%d", &n );的意思不等于ret=n;而是当n接收到一个整型值时候ret=1;while ( ret != 1 );跳出循环如果当用户输入一个字符类型的数据,那么这个时候 n已定义为一个整型就无法接收了所以n没有接收到值此时候ret=0;而getchar正是来接受字符的,当用户输入了回车('n')后接收完毕跳出while ( getchar() != 'n' ); 注意这里

36、的while 顺环体为空语句这个时候while ( ret != 1 );(因为ret=0,条件为真继续执行该循环)所以说如果你输入了一个非int类型那么接下来的又会printf( "Input an integer: " );ret = scanf( "%d", &n );(直到输入为int类型止) 四。虽然不可以用 fflush(stdin),但是我们可以自己写代码来清空输入缓冲区。只需要在 scanf 函数后面加上几句简单的代码就可以了。DE>/* C 版本 */#include <stdio.h>int mai

37、n( void )    int i, c;    for (;)         fputs("Please input an integer: ", stdout);        if ( scanf("%d", &i) != EOF ) /* 如果用户输入的不是 EOF */  &#

38、160;         /* while循环会把输入缓冲中的残留字符清空 */            /* 可以根据需要把它改成宏或者内联函数 */            /* 注:C99中也定义了内联函数,gcc3.2支持 */   &

39、#160;        while ( (c=getchar() != 'n' && c != EOF )                                /* end o

40、f while */                printf("%dn", i);        return 0;/* C+ 版本 */#include <iostream>#include <limits> / 为了使用numeric_limitsusing std:cout;using std:endl;

41、using std:cin;int main( )    int value;     for (;)     cout << "Enter an integer: "    cin >> value;    /* 读到非法字符后,输入流将处于出错状态,     * 为了继续获取输入,首先要调用clear

42、函数     * 来清除输入流的错误标记,然后才能调用     * ignore函数来清除输入缓冲区中的数据。 */    cin.clear( );    /* numeric_limits<streamsize>:max( ) 返回缓冲区的大小。     * ignore 函数在此将把输入缓冲区中的数据清空。   

43、0; * 这两个函数的具体用法请自行查询。 */    cin.ignore( std:numeric_limits<std:streamsize>:max( ), 'n' );     cout << value << 'n'         return 0;DE>清空输入缓冲区的方法 在获取用户输入时,如果发生类型不匹配的错误,输入设备对象将处在出

44、错状态,不能继续输入信息。例如,cin >> i; 输入一个字幕'a',就会出现错误。这时,需要清空输入缓冲区,以继续输入信息。 fflush (stdin)在c+标准中,未定义其返回,vc对其进行了扩充,但其他编译器不一定能通过编译。要写可移植的代码,可用以下方法来清空输入缓冲区。只需要在scanf函数后面加上几句简单的代码就可以了。 /*C版本*/ int main(void) int i,c; for(;) fputs ("Pleaseinputaninteger:", stdout); if(scanf("%d",&a

45、mp;i)!=EOF) /*如果用户输入的不是EOF*/ /*while循环会把输入缓冲中的残留字符清空*/ /*读者可以根据需要把它改成宏或者内联函数*/ /*注:C99中也定义了内联函数,gcc3.2支持*/ while (c=getchar() != 'n'&&c!=EOF) ; /*endofwhile*/ printf ("%dn", i); return 0; /C+版本 usingstd:cout; usingstd:endl; usingstd:cin; int main() int value; for (; ;) cout

46、 << "Enteraninteger:" cin >> value; /*读到非法字符后,输入流将处于出错状态, *为了继续获取输入,首先要调用clear函数 *来清除输入流的错误标记,然后才能调用 *ignore函数来清除输入缓冲区中的数据。*/ cin.clear(); /*numeric_limits:max()返回缓冲区的大小。 *ignore函数在此将把输入缓冲区中的数据清空。 *这两个函数的具体用法请读者自行查询。*/ cin.ignore (std:numeric_limits:max(), 'n'); cout<

47、; return0; 对c版本做法的争议: if (scanf ("%d", &i) != EOF) while (c=getchar() != 'n' && c != EOF) ; 并没有完全解决了问题,存在重大的漏洞。主要问题在于,使用getchar()这种方法并没有清除EOF标志。如果用tc2.0、tc2.01、tc3.0、tc3.1等等编译器运行上述代码,输入时用ctrl+z结尾或者直接输入 ctrl+z,程序肯定会进入一个死循环! 原因就是getchar()方式并没有清除EOF标志,我在这里所说的EOF标志并非指函数返回的E

48、OF,而是指当I/O函数遇到EOF时在其内部产生的EOF标志。 偶推荐用rewind (stdin)这个方法,rewind不仅清除了stdin中的内容,还清除EOF标志,用下列语句: scanf ("%d", &i); rewind (stdin); 代替上述if语句,无论你如何输入ctrl+z,都不会进入死循环,同时也简单得多,是比较完美的解决方法。 string类型转换 char*型的字符串可以用c+的 sprintf ,还有MFC的 CString:Format 也不错进行numberTostring的转换。 atof, atoi, atol, _ecvt,

49、_fcvt, _itoa, _i64toa, _itow, _i64tow 这些也是用于char*型的转换numberTostring/stringTonumber。 对于标准c+的string型字符串,可以用以下方法进行类型转换。 stringTonumber 用istringstream,这里给个例子: template T& toValue(const string& s, T& value) istringstream is(s); is >> value; if (is.fail() value = 0; return value; / inclu

50、de string s = "12345" int n = 0; toValue(s, n); 附加一个例子: istringstream iss("123 1.23 aaa ,zzz kk,k oo.jjj"); cout << iss.str() << endl; char ch; iss >> ch; cout << ch << endl; iss >> i; cout << i << endl; float f; iss >> f; cou

51、t << f << endl; char buf1024; iss >> buf; cout << buf << endl; cout << "OKn" iss.ignore (100, 'j'+1); iss >> buf; cout << buf << endl; numberTostring string a; 1、 ostringstream oss(a); oss << 999999; a = oss.str (); 2、 str

52、ingstream ss (a); ss << 9; ss >> a; cout << a; 3、 itoa (111, buf, 10); /十进制 a = buf; /char* 赋值到 string; sscanf 的例子 include void main( void ) char tokenstring = "15 12 14." char s81; char c; int i; float fp; /* Input various data from tokenstring: */ sscanf( tokenstring, &

53、quot;%s", s ); sscanf( tokenstring, "%c", &c ); sscanf( tokenstring, "%d", &i ); sscanf( tokenstring, "%f", &fp ); /* Output the data read */ printf( "String = %sn", s ); printf( "Character = %cn", c ); printf( "Integer: = %dn", i ); printf( "Real: = %fn", fp ); Output String = 15 Character = 1 Integer: = 15 Real: = 15.000000 sprintf 的例子 include void main( void ) char buffer200, s = "compute, c = 'l'

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论