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存储的是地址。。

评论