正文

[C++]文件输出的怪异(BUG)之处2006-07-08 19:32:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/fengfei/16473.html

分享到:

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

阅读(3731) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册