PS: 本来想写一个文件分割的程序,复习了下文件的输入输出,结果被偶发现了这个怪异之处。。呵呵
#include <fstream.h>
// 写入
int main( void )
{
char *name = "heshaohua";
int age = 21;
float salary = 2000;
ofstream fout("Text.txt"); // 打开文件写入
// 写入资料
fout << "此行写入了Test.txt中\n"; // 次句话长度为20,后面有用。
fout << name << " " << age << " " << salary;
fout.close();
return 0;
}
===================================================================
#include <fstream.h>
// 读取
int main( void )
{
char line[1]; // 读取“此行写入了Test.txt中”这句话
char name[10]; // 读取姓名
int age;
float salary;
char *test; // 测试从文本line[1]读取的信息
ifstream fin("Text.txt"); // 打开文件读取
fin >> line;
fin >> name >> age >> salary;
cout << line << endl; // 奇怪之处:注意line数组的大小只有1,但却能输出Text.txt的第一行的所有信息
cout << name << " " << age << " " << salary << endl; // 输出姓名
/* 测试奇怪之处 */
test = line; // 获得line数组的第一个元素地址
int i;
/* 以一个一个字符形式输出test */
for( i = 0; i < 21; i++ ) // 显示从line第一个元素地址开始到其后面的21个地址的信息。
{ // “此行写入了Test.txt中”长度为20, 所以第21个地址的信息是'\0'
cout << test[i] << endl; // 应此会多出一个空的行。
}
cout << (int)test[20] << endl; // 以整数形式输出第21个地址的信息,其输出为0;
/* 以整句输出test */
cout << test << endl; // 输出结果为“此行写入了Test.txt中”
/* 在line第三个地址处赋值为'\0' */
line[2] = '\0';
cout << test << endl; // 输出结果为“此”, 没有象上面一样输出“此行写入了Test.txt中”
fin.close();
return 0;
}
运行结果如下:
总结:
fin >> line; 此句将Text.txt文本的第一行“此行写入了Test.txt中”全部写入到内存里去 了,虽然line数组大小为1,但是这个line却存储了“此”字第一个字符(此占2个字符)的地址,而“此”第2个字符 以及后面的“行写入了Test.txt中”的地址都是从“此”字第一个字符的地址+1偏移下去的。
cout << line << endl; 为什么他能输出“此行写入了Test.txt中”这一整句呢?
因为cout输出是以碰到'/0'来结束输出的,而line第一个地址存的不是'\0',所以cout就没有结束输出,而是继续输出line第一个地址的下一个地址的值,就这样一直输出,直到输出到第21个地址时,由于第21一个地址存的值为'\0',所以cout就结束了输出。
line[2] = '\0';
cout << test << endl; 为什么这句却只输出为“此”呢?
因为line[2] = '\0'将line第三个地址赋值为'\0'了,因此cout在碰到'\0'后就结束了输出。 因而只输出了“此”字。
将char line[1]改成char line
如果将char line[1]改成char line则不行,因为char line定义的是一个字符变量,他存储的不是地址。而char line[1]则是一个数组,数组实质就是指针,line存储的是地址。。
评论