你之所以输出一些乱码是因为你第一次写入文件后,文件指针已经移动到了文件未尾,
此时你读的话是从最后一个'文件结束符\0‘开始读的,那后面肯定是乱码了,
在你重置后你又读了15个字符,如果你刚好输入的是15个的话,那就能正确读出来,否则后面的
一段肯定会是乱码
解决办法:
1、是在写完文件后,关闭然后再打开
在这一段前面 加一句
fclose(p);
if((p=fopen("test.txt","wt+"))==0)
{
printf("can not open the file");
exit(1);
}
printf("请输入要保存到文件的字符窜:");
gets(ch);
fputs(ch,p);
printf("立即读取字符串:"); //必须将文件指针指向 文件头,否则输出的会是乱码,重新打开或者是使用rewind函数
fgets(ch,15,p);
printf("立即读取字符串为:%s\n",ch);
你在字符数组最后输入一个null,就不会有非法字符了,比如
char ch[15];
ch[14]='\0';
#include"stdio.h"
#include"process.h"
#include "string.h"
#define N 3//使用宏定义数组长度
void main()
{
FILE *p;
char ch[N];
int len;
memset(ch,'\0',N);//初始化ch,每个元素置0
if((p=fopen("test.txt","wt+"))==0)
{
printf("can not open the file");
exit(1);
}
printf("请输入要保存到文件的字符窜:");
gets(ch);
len=strlen(ch);
if(len>=N)//判断输出长度
{
printf("输入长度超过%d\n",N);
exit(1);
}
printf("ch=%s\n",ch);
fputs(ch,p);
fgets(ch,len+1,p);
printf("立即读取字符串为:%s\n",ch);
rewind(p);
fgets(ch,len+1,p);
printf("重置后再读取字符窜为:%s\n",ch);
fclose(p);
}
高啊,在此举出你所给出的代码的若干错误。
首先,你的代码不完整。第9、11、13行要定义三个100行的二维字符数组,如果仅仅是类似char adj[100][12]=的定义;这样adj[1]到adj[99]这99个词都会是空值(ASCII码为0),若用printf()函数把这个范围内的某个字符数组打印,将会什么都看不到。所以,你记得要把这总共300个词补全。
其次,格式化输出的格式有错误。若定义一个字符数组,char ch[20] = "hahaha";将它以字符串的形式输出,用printf("%s",ch);而在以上代码中,%s全都写成了s%。以后不要粗心了啊。
再次,也是以刚刚我举的为例。20位的字符数组ch[20]以字符串形式输出,用到的是printf("%s",ch);注意,这里是ch而不是ch[20]。现在你知道问题出在哪里了吧。若是将二维数组adj[100][12]的第0行字符数组以字符串形式输出,那应该是printf("%s", adj[0]);注意这里是adj[0]而不是adj[0][12],如果你用adj[0][12],逻辑上来讲,不是数组访问越界嘛。
最后,尽量不要在C语言代码中夹杂中文,虽然我知道你是在做说明,那就正规点用//作注释。不要再写成char verb[100][8]=; 养成良好的代码书写习惯也是学习C语言很重要的一环。
特别提醒这四个问题,祝你编程方面有所提高。另外说明一声,C语言是认汉字的,你老师说的没错。
以下附上正确代码,在VC6中编译运行通过了的。具体不知道你要什么样的300个单词,这部分就自己补全吧。
#include
#include
#include
void main(void)
{
srand( (unsigned)time( NULL ) ); //埋下时间种子
char adj[100][12]=; //补全剩下99个单词
char verb[100][8]=; //补全剩下99个单词
char noun[100][12]=; //补全剩下99个单词
char pron[12][12]=;
int a[17],i; //定义随机结构变量数组 a 和 循环结构控制变量 i
for (i=0;i<16;i++)
{
a[i]=rand()%100;
} //给随机数组中的前16个元素赋0-99的随机值
a[16]=rand()%12; //给随机数组中的最后一个元素赋0-11的随机值
printf("%s是%s\n%s,%s,%s\n%s在%s,%s%s在%s\n%s%s和%s%s在%s\n%s是%s",noun[a[0]],adj[a[1]],noun[a[2]],noun[a[3]],noun[a[4]],pron[a[16]],verb[a[5]],adj[a[6]],noun[a[7]],verb[a[8]],adj[a[9]],adj[a[10]],adj[a[11]],noun[a[12]],verb[a[13]],noun[a[14]],adj[15]); //输出结果
}
同楼上回答。。。虽然在我的机器上没啥问题。