正文

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

 

阅读(3469) | 评论(0)


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

评论

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