大家来帮我看看,这是我舅妈家的老式台式电脑,我不会弄,弄了几下还是开不了机,大家帮忙看下,怎么搞?

&&/&&&&/&&&&/&&&&/&&
二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。
对二进制文件的操作也需要先打开文件,用完后要关闭文件。在打开时要用ios::binary指定为以二进制形式传送和存储。二进制文件除了可以作为输入文件或输出文件外,还可以是既能输入又能输出的文件。这是和ASCII文件不同的地方。
用成员函数read和write读写二进制文件
对二进制文件的读写主要用istream类的成员函数read和write来实现。这两个成员函数的原型为
& & istream& read(char *buffer,int len);
& & ostream& write(const char * buffer,int len);
字符指针buffer指向内存中一段存储空间。len是读写的字节数。调用的方式为:
& & a. write(p1,50);
& & b. read(p2,30);
上面第一行中的a是输出文件流对象,write函数将字符指针p1所给出的地址开始的50个字节的内容不加转换地写到磁盘文件中。在第二行中,b是输入文件流对象,read 函数从b所关联的磁盘文件中,读入30个字节(或遇EOF结束),存放在字符指针p2所指的一段空间内。
[例13.14] 将一批数据以二进制形式存放在磁盘文件中。
#include &fstream&
struct student
char name[20];
int main( )
student stud[3]={&Li&,1001,18,'f',&Fun&,1002,19,'m',&Wang&,1004,17,'f'};
ofstream outfile(&stud.dat&,ios::binary);
if(!outfile)
cerr&&&open error!&&&
abort( );//退出程序
for(int i=0;i&3;i++)
outfile.write((char*)&stud[i],sizeof(stud[i]));
outfile.close( );
用成员函数write向stud.dat输出数据,从前面给出的write函数的原型可以看出: 第1个形参是指向char型常变量的指针变量buffer,之所以用const声明,是因为不允许通过指针改变其指向数据的值。形参要求相应的实参是字符指针或字符串的首地址。现在要将结构体数组的一个元素(包含4个成员)一次输出到磁盘文件stud.dat。&tud[i] 是结构体数组第i个元素的首地址,但这是指向结构体的指针,与形参类型不匹配。因此 要用(char *)把它强制转换为字符指针。第2个参数是指定一次输出的字节数。sizeof (stud[i])的值是结构体数组的一个元素的字节数。调用一次write函数,就将从&tud[i]开始的结构体数组的一个元素输出到磁盘文件中,执行3次循环输出结构体数组的3个元素。
其实可以一次输出结构体数组的个元素,将for循环的两行改为以下一行:
& &outfile.write((char*)&stud[0],sizeof(stud));
执行一次write函数即输出了结构体数组的全部数据。
abort函数的作用是退出程序,与exit作用相同。
可以看到,用这种方法一次可以输出一批数据,效率较高。在输出的数据之间不必加入空格,在一次输出之后也不必加回车换行符。在以后从该文件读入数据时不是靠空格作为数据的间隔,而是用字节数来控制。
[例13.15] 将刚才以二进制形式存放在磁盘文件中的数据读入内存并在显示器上显示。
#include &fstream&
struct student
int main( )
student stud[3];
ifstream infile(&stud.dat&,ios::binary);
if(!infile)
cerr&&&open error!&&&
for(i=0;i&3;i++)
infile.read((char*)&stud[i],sizeof(stud[i]));
infile.close( );
for(i=0;i&3;i++)
cout&&&NO.&&&i+1&&
cout&&&name:&&&stud[i].name&&
cout&&&num:&&&stud[i].num&&;
cout&&&age:&&&stud[i].age&&
cout&&&sex:&&&stud[i].sex&&endl&&
运行时在显示器上显示:
name: Wang
请思考,能否一次读入文件中的全部数据,如:
& & infile.read((char*)&stud[0],sizeof(stud));
答案是可以的,将指定数目的字节读入内存,依次存放在以地址&tud[0]开始的存储空间中。要注意读入的数据的格式要与存放它的空间的格式匹配。由于磁盘文件中的数据是从内存中结构体数组元素得来的,因此它仍然保留结构体元素的数据格式。现在再读入内存,存放在同样的结构体数组中,这必然是匹配的。如果把它放到一个整型数组中,就不匹配了,会出错。
与文件指针有关的流成员函数
在磁盘文件中有一个文件指针,用来指明当前应进行读写的位置。在输入时每读入 一个宇节,指针就向后移动一个字节。在输出时每向文件输出一个字节,指针就向后移动 一个字节,随着输出文件中字节不断增加,指针不断后移。对于二进制文件,允许对指针进行控制,使它按用户的意图移动到所需的位置,以便在该位置上进行读写。文件流提供 一些有关文件指针的成员函数。为了查阅方便,将它们归纳为表13.7,并作必要的说明。
表13.7 文件流与文件指针有关的成员函数
返回最后一次输入所读入的字节数
返回输入文件指针的当前位置
seekg(文件中的位置)
将输入文件中指针移到指定的位置
seekg(位移量,&参照位置)
以参照位置为基础移动若干字节
返回输出文件指针当前的位置
seekp(文件中的位置)
将输出文件中指针移到指定的位置
seekp(位移量,&参照位置)
以参照位置为基础移动若干字节
几点说明:
1) 这些函数名的第一个字母或最后一个字母不是g就是p。带 g的是用于输入的函数(g是get的第一个字母,以g作为输入的标识,容易理解和记忆), 带p的是用于输出的函数(P是put的第一个字母,以P作为输出的标识)。例如有两个 tell 函数,tellg用于输入文件,tellp用于输出文件。同样,seekg用于输入文件,seekp用于输出文件。以上函数见名知意,一看就明白,不必死记。
如果是既可输入又可输出的文件,则任意用seekg或seekp。
2) 函数参数中的&文件中的位置&和&位移量&已被指定为long型整数,以字节为单位。&参照位置&可以是下面三者之一:
& & ios::beg &文件开头(beg是begin的缩写),这是默认值。
& & ios::cur &指针当前的位置(cur是current的缩写)。
& & ios::end &文件末尾。
它们是在ios类中定义的枚举常量。举例如下:
& & infile.seekg(100); &//输入文件中的指针向前移到字节位置
& & infile.seekg(-50,ios::cur); &//输入文件中的指针从当前位置后移字节
& & outfile.seekp(-75,ios::end); &//输出文件中的指针从文件尾后移字节
随机访问二进制数据文件
一般情况下读写是顺序进行的,即逐个字节进行读写。但是对于二进制数据文件来说,可以利用上面的成员函数移动指针,随机地访问文件中任一位置上的数据,还可以修改文件中的内容。
[例13.16] 有个学生的数据,要求:
把它们存到磁盘文件中;
将磁盘文件中的第,3,5个学生数据读入程序,并显示出来;
将第个学生的数据修改后存回磁盘文件中的原有位置。
从磁盘文件读入修改后的个学生的数据并显示出来。
要实现以上要求,需要解决个问题:
由于同一磁盘文件在程序中需要频繁地进行输入和输出,因此可将文件的工作方式指定为输入输出文件,即ios::in|ios::out|ios::binary。
正确计算好每次访问时指针的定位,即正确使用seekg或seekp函数。
正确进行文件中数据的重写(更新)。
可写出以下程序:
#include &fstream&
struct student
char name[20];
int main( )
student stud[5]={1001,&Li&,85,1002,&Fun&,97.5,1004,&Wang&,54,1006,&Tan&,76.5,1010,&ling&,96};
fstream iofile(&stud.dat&,ios::in|ios::out|ios::binary);
//用fstream类定义输入输出二进制文件流对象iofile
if(!iofile)
cerr&&&open error!&&&
for(int i=0;i&5;i++)
//向磁盘文件输出个学生的数据
iofile.write((char *)&stud[i],sizeof(stud[i]));
student stud1[5];
//用来存放从磁盘文件读入的数据
for(int i=0;i&5;i=i+2)
iofile.seekg(i*sizeof(stud[i]),ios::beg);
//定位于第,2,4学生数据开头
//先后读入个学生的数据,存放在stud1[0],stud[1]和stud[2]中
iofile.read((char *)&stud1[i/2],sizeof(stud1[0]));
//输出stud1[0],stud[1]和stud[2]各成员的值
cout&&stud1[i/2].num&&& &&&stud1[i/2].name&&& &&&stud1[i/2].score&&
stud[2].num=1012;
//修改第个学生(序号为)的数据
strcpy(stud[2].name,&Wu&);
stud[2].score=60;
iofile.seekp(2*sizeof(stud[0]),ios::beg);
//定位于第个学生数据的开头
iofile.write((char *)&stud[2],sizeof(stud[2]));
//更新第个学生数据
iofile.seekg(0,ios::beg);
//重新定位于文件开头
for(int i=0;i&5;i++)
iofile.read((char *)&stud[i],sizeof(stud[i]));
//读入个学生的数据
cout&&stud[i].num&&& &&&stud[i].name&&& &&&stud[i].score&&
iofile.close( );
运行情况如下:
1001 Li 85(第个学生数据)
1004 Wang 54&&&&&&& (第个学生数据)
1010 ling 96&&&&&&& (第个学生数据)
1001 Li 85&&&&&&&&& (输出修改后个学生数据)
1002 Fun 97.5
1012 Wu 60&&&&&&&&& (已修改的第个学生数据)
1006 Tan 76.5
1010 ling 96
本程序也可以将磁盘文件stud.dat先后定义为输出文件和输入文件,在结束第一次的输出之后关闭该文件,然后再按输入方式打开它,输入完后再关闭它,然后再按输出方式打开,再关闭,再按输入方式打开它,输入完后再关闭。显然这是很烦琐和不方便的。 在程序中把它指定为输入输出型的二进制文件。这样,不仅可以向文件添加新的数据或读入数据,还可以修改(更新)数据。利用这些功能,可以实现比较复杂的输入输出任务。
请注意,不能用ifstream或ofstream类定义输入输出的二进制文件流对象,而应当用fstream类。> 博客详情
使用 C 语言的 fopen 打开文件时,可以指定的 mode 有 12 个,其中 6 个包含&&"b"
使用 C++ 的 fstream 打开文件时,可用的模式组合有 24 个(?),其中 12 个包含&&"binary"
使用 python 的 open 打开文件,除了可以使用 C 中的 12 个模式外,还可以使用&&"U" 或 "rU"
使用 Qt 库的 QFile 打开文件时,可以指定&&QIODevice::Text&&&或不指定
如此种种,看起来是如此的复杂,难怪很多刚接触编程的网友都不相信(或者不想相信):
这一切仅仅是为了一个小小的换行符!
是啊,一个小小的换行符值得如此大动干戈么?
当使用 windows 下弱智的记事本时,会不会遇到:本该换行的地方,它显示一个黑色方块?
当使用高级点的编辑器时,是不是都提供设置换行符的功能?
当使用跨平台的工具 (比如windows下git) ,是不是需要特别注意换行符设置?
文本 vs 二进制
哎,等等...
你前面提的C中的"b",C++中的"fstream::binary",Qt的"QFile::Text",我都知道啊:不是区分文本和二进制操作的么?和换行符有什么关系?!
那么我们有必须要看看:
什么是文本文件(Text File)?
所有的文件都是二进制文件(Binary File)
如果一个二进制文件的内容全是可打印的字符和空白字符(空格、Tab、回车、换行等)组成,可称其为文本文件。
换句话说:本来就不存在 文本文件 这个独立类别,文本文件属于二进制文件。
如果这样,为何C、C++等等打开文件是都提供文本和二进制两种模式么?(暂不解释^_^)
考虑一个例子:打开文件(不管后缀名等等),分别写入:
"/x10/x11/x12/x13/x14"
不可见字符
"/x30/x31/x32/x33/x34"
而后者由于全部是可打印字符,你可能就会称其为文本文件。
文件 vs 模式
注意区分两个概念:当我们提C、C++打开文件的方式时,我们一直在说 文本模式 和二进制模式,而不是说打开 文件文件 和二进制文件。这中间有很微妙的区别。
任何一个文件,你都可以用文本或二进制模式打开。但是对于 *.png 等这些东西,你用文本模式打开读进来的往往不是你期望的结果。
考虑这样一个文件 hello.txt,其内容:
line1/r/nline2/r/n
如果在windows下:你用文本模式打开,读进来多少个字符?用二进制模式打开,又是多少个字符?为何同一个文件,读进来的不一样?
换个角度考虑考虑
我们前面提到(C、C++、Python、还有不该和语言并列Qt)的文件操作,都是需要通过系统调用对文件进行操作的。具体一点:
在Windows下,不管通过哪种方式,最终都需要使用
HANDLE&WINAPI&CreateFile(
&&__in&&&&&&LPCTSTR&lpFileName,
&&__in&&&&&&DWORD&dwDesiredAccess,
&&__in&&&&&&DWORD&dwShareMode,
&&__in_opt&&LPSECURITY_ATTRIBUTES&lpSecurityAttributes,
&&__in&&&&&&DWORD&dwCreationDisposition,
&&__in&&&&&&DWORD&dwFlagsAndAttributes,
&&__in_opt&&HANDLE&hTemplateFile
参数很多,每一个参数又有很多标记位组成(具体看MSDN)。但是你可以发现:对它来说,不存在文本文件和二进制文件的区别,你也无法设置text或binary等标记位!!
在posix 系统下,文件操作需要
int&open(const&char&*pathname,&int&flags);
int&open(const&char&*pathname,&int&flags,&mode_t&mode);
int&creat(const&char&*pathname,&mode_t&mode);
同样,这儿可以设置flags和mode,可以设置的标记很多。但是就是没有提供text和binary相关的东西!!
是不是很有意思?
系统的文件操作接口压根就没有二进制和文本的区别!
使用这些接口的C、C++、Python 却提供了二进制和文本两种模式
是时候谈&&换行符&&&了:
line break
EOL (end-of-line)
想象一下,一个文本编辑器打开一个"文本文件",遇到哪个字符开始换行呢?
想想Windows下的记事本,遇到遇到"/r/n"它处理成换行,遇到'/n'它就只会显示黑方框。
应用程序和操作系统通常用1到2个字符代表换行:
Windows、DOS、Symbian、Palm ...
GNU/Linux、Mac OS X、FreeBSD ...
Mac OS 9(之前)...
QNX 在posix之前
z/OS、i5/OS ...
这些之中,其实我们也只对 CR+LF 与 LF 这两种换行符感兴趣。
有什么问题么?
本来一切很正常的:
在Windows下:
调用 CreateFile 打开文件HANDLE&hFile&=&CreateFile&(TEXT("twoline.txt"),&GENERIC_WRITE,&0,&NULL,&OPEN_ALWAYS,&FILE_ATTRIBUTE_NORMAL,&&&NULL);
调用 WriteFile 写入两行DWORD&dwBytesW
WriteFile&(hFile,&"line1/r/nline2/r/n",&14,
&&&&&&&&&&&&&&&&&&dwBytesWritten,&NULL);
调用CloseHandle关闭文件CloseHandle(hFile);
在Posix系统下
调用open打开文件int&fd&=&open("twolines.txt",&O_WRONLY|O_CREAT);
调用write写入两行write(fd,&"line1/nline2/n",&12);
调用close关闭文件close(fd);
各个平台相安无事,windows下你想换行就用'/r/n',posix下想换行就用'/n'
如何就出问题了呢?
各个平台的换行符不一致,一旦涉及跨平台问题就出来了。
考虑一下,如果使用C语言的binary模式的话,我们想生成一个像前面一样包含两行代码的文件,该怎么办?
根据平台不同,用#if #else 进行预处理?&#ifdef&_WIN
&fwrite("line1/r/nline2/r/n");
&fwrite("line1/nline2/n");
还是采用某种方式,同一行代码:在不同平台下生成不同的东西&&fwrite("line1/nline2/n");
应该就是为了这个吧,引入了一个"文本模式"
写入时,遇到'/n'就转换成平台相关的换行符(对与windows就是"/r/n");
读入时,遇到平台相关的换行符(比如windows下的"/r/n"),转换成'/n'
注意:对与posix系统,'/n'就是系统换行符,不存在转换
所以我们经常听说:linux下文本文件和二进制文件没有区别。
正是为了这个换行符,所以C、C++、Python等语言提供的文件操作函数才都有了Text、Binary两种模式:
C、C++、Qt
C语言的文件操作
#include&&stdio.h&
FILE&*fopen(const&char&*&restrict&filename,&const&char&*&restrict&mode);
除了文件名之外,还要传递一个 mode 的字符串作为标记。而这些标记分为带b和不带b两类:
只读或只写
文件必须存在
文件存在则清空、不存在则创建
追加;文件不存在则创建
r+b&或&&rb+
C++的文件操作时
explicit&fstream&(&const&char&*&filename,ios_base::openmode&mode&=&ios_base::in&|&ios_base::out&);
除了文件名之外,我们需要传递一个 mode:
(app&end) 每次写操作前找到文件尾
(at e&nd) 打开文件后立即将文件定位到文件尾
(binary&) 以二进制模式进行IO操作
(in&put) 允许读操作
(out&put) 允许写操作
(trunc&ate) 打开文件时清空文件流
这样看似乎没神马意思哈?一般都是组合使用的:
in、out、app、trunc的有效组合如下
清空文件内容
in|out|trunc
清空文件内容
6个标记这儿只提了4个,其他两个和这儿的可以随意组合,不受限制(我对此不太确定,dbzhang800 )
也就是:带binary和不带binary的组合数目一样多的
Qt的文件操作
bool&QFile::open&(&OpenMode&mode&)
这儿是mode又是什么东西?
QIODevice::NotOpen
QIODevice::ReadOnly
QIODevice::WriteOnly
QIODevice::ReadWrite
QIODevice::Append
QIODevice::Truncate
QIODevice::Text
QIODevice::Unbuffered
现在国内用linux的似乎越来越多了,很多人有这个问题:
linux下创建了一个包含中文的文件,拷贝到windows下面。
&用记事本打开看&==&&汉字正确,换行的地方出现了黑方块
&用写字板打开看&==&&换行正确,汉字乱码
很有意思?可是如何解决?
找个支持utf8编码和'/n'换行的编辑器即可解决问题。
在linux采用"/r/n"换行和gb18030编码保存文件,也可以解决问题
如果就用windows系统自带的记事本&和写字板&怎么办?看好了:
先用写字板打开文件,不用管乱码问题,直接保存。
再用记事本打开。(恩,此时一切正常)
C99标准 (ISO/IEC .5.3 The fopen function)
C++ Primer (8.4.2 文件模式)
Python2.7 manual
Qt4.7 manual
Windows核心编程(10.1 打开和关闭设备)
人打赏支持
码字总数 10704
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥
& 开源中国(OSChina.NET) |
开源中国社区(OSChina.net)是工信部
指定的官方社区新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 86, 距离下一级还需 114 积分
论坛徽章:0
本帖最后由 allmycheers 于
17:51 编辑
有没有合并二进制文件的命令?
我用 cat 001.pdf 002.pdf &&&hb.pdf&&和&&paste&&001.pdf 002.pdf &&&hb.pdf& & 都不行,结果只显示002.pdf的内容。
他们合并字符文件还可以。
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
小富即安, 积分 3958, 距离下一级还需 1042 积分
论坛徽章:0
pdf 文件是二进制文件? 不知道LZ是要干吗?是要合并两个pdf 文件?
白手起家, 积分 158, 距离下一级还需 42 积分
论坛徽章:0
我是死菜鸟帮不了你啊,
家境小康, 积分 1195, 距离下一级还需 805 积分
论坛徽章:0
pdf文件不是二进制文件吧...
稍有积蓄, 积分 262, 距离下一级还需 238 积分
论坛徽章:0
同意楼上观点
白手起家, 积分 86, 距离下一级还需 114 积分
论坛徽章:0
认识失误...
那么怎样用命令合并两个pdf格式的文件 和 合并两个word的文件?
丰衣足食, 积分 665, 距离下一级还需 335 积分
论坛徽章:0
软件实现那?必须用命令吗
稍有积蓄, 积分 213, 距离下一级还需 287 积分
论坛徽章:0
首先 明确一下概念
能用文本编辑器打开直接看到内容的是文本文件(这里的文本文件是广义的,也包括 .bat .sh 等等)
其余的都是二进制文件 二进制文件有自己特定的格式(有固定的文件头)
不知道为什么楼上那么多同学认为pdf不是二进制文件
pdf文件的分割与合并可以通过工具,比如 PDF Split and Merge ()
小富即安, 积分 3958, 距离下一级还需 1042 积分
论坛徽章:0
首先 明确一下概念
能用文本编辑器打开直接看到内容的是文本文件(这里的文本文件是广义的,也包括 .bat . ...
炙热的雪 发表于
涨知识了 ...
另外如果你的系统是Fedora 12 想把几个pdf 文件合并为一个pdf 文件,
可以尝试下面的命令进行安装:
yum install pdfshuffler
Or yum install pdfmerge
大富大贵, 积分 14608, 距离下一级还需 5392 积分
论坛徽章:0
可以用dd合并
21:16:16 &ls -lh
total 188K
-rw-r--r-- 1 moerae moerae 187K Jul 21 21:12 file
21:16:54 &md5sum file
fd8c662e0&&file
21:16:59 &dd if=file of=file1 bs=512 count=200
200+0 records in
200+0 records out
102400 bytes (102 kB) copied, 0. s, 85.1 MB/s
21:17:20 &dd if=file of=file2 bs=512 skip=200
173+1 records in
173+1 records out
88661 bytes (89 kB) copied, 0. s, 83.8 MB/s
21:17:35 &ls -lh
total 376K
-rw-r--r-- 1 moerae moerae 187K Jul 21 21:12 file
-rw-r--r-- 1 moerae moerae 100K Jul 21 21:17 file1
-rw-r--r-- 1 moerae moerae&&87K Jul 21 21:17 file2
21:17:38 &cp file1 merge
21:17:47 &dd if=file2 of=merge bs=512 seek=200
173+1 records in
173+1 records out
88661 bytes (89 kB) copied, 0. s, 72.3 MB/s
21:18:16 &ls -lh
total 564K
-rw-r--r-- 1 moerae moerae 187K Jul 21 21:12 file
-rw-r--r-- 1 moerae moerae 100K Jul 21 21:17 file1
-rw-r--r-- 1 moerae moerae&&87K Jul 21 21:17 file2
-rw-r--r-- 1 moerae moerae 187K Jul 21 21:18 merge
21:18:18 &md5sum file
fd8c662e0&&file
21:18:24 &md5sum merge
fd8c662e0&&merge
21:18:27 &
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处

我要回帖

更多关于 帮我看看我的木耳黑么 的文章

 

随机推荐