يبدو أن FGETS () تتفوق على المدخلات إلى متغيرات أخرى
سؤال
أقوم بقراءة من ملف ، ولكن يبدو أن الإدخال "يفيض" في متغيرات أخرى.
لدي هذين المتغيرين:
char str[250]; //used to store input from stream
char *getmsg; //already points to some other string
المشكلة هي ، عندما أستخدم fgets()
لقراءة المدخلات
printf("1TOKEN:%s\n",getmsg);
fp=fopen("m.txt","r");
fp1=fopen("m1.txt","w");
if(fp!=NULL && fp1!=NULL)
printf("2TOKEN:%s\n",getmsg);
while(fgets(str,250,fp)!=NULL){
printf("3TOKEN:%s\n",getmsg);
printf("read:%s",str);
printf("4TOKEN:%s\n",getmsg);
أحصل على شيء مثل هذا:
1TOKEN:c
2TOKEN:c
3TOKEN:b atob atobbody
read:a b atob atobbody
4TOKEN:b atob atobbody
ترى كيف str
نوع من التدفقات getmsg
. ماذا حدث هناك؟ كيف يمكنني تجنب الحدوث؟
شكرا مقدما :)
في الكود ، يطلق على "GetMsg" اسم "Token" ، اعتقدت أنه قد يكون له علاقة بأسماء متطابقة أو شيء ما ، لذا قمت بتغييره إلى GetMsg ، نفس الخطأ ، لذلك قمت بتغييره مرة أخرى ...
if(buf[0]=='C'){
int login_error=1;
fp=fopen("r.txt","r");
if(fp!=NULL){
memcpy(&count,&buf[1],2);
pack.boxid=ntohs(count);
memcpy(pack.pword,&buf[3],10);
printf("boxid:%u pword:%s\n",pack.boxid,pack.pword);
while(fgets(str,250,fp)!=NULL){
/*"getmsg"===>*/ token=strtok(str," ");
token=strtok(NULL," ");//receiver uname
token1=strtok(NULL," ");//pword
token2=strtok(NULL," ");//boxid
sscanf(token2,"%hu",&count);//convert char[] to unsigned short
if(pack.boxid==count && strcmp(token1,pack.pword)==0){//uname & pword found
login_error=0;
printf("found:token:%s\n",token);
break;
}
}
if(login_error==1){
count=65535;
pack.boxid=htons(count);
}
if(login_error==0){
count=0;
pack.boxid=htons(count);
}
fclose(fp);
}
printf("1TOKEN:%s\n",token);
if(login_error==0){
int msg_error=1;
fp=fopen("m.txt","r");
fp1=fopen("m1.txt","w");
if(fp!=NULL && fp1!=NULL){
printf("2TOKEN:%s\n",token);
while(fgets(str,250,fp)!=NULL){
printf("3TOKEN:%s\n",token);
printf("read:%s",str);
token1=strtok(str," ");//sender
token2=strtok(NULL," ");//receiver
token3=strtok(NULL," ");//subject
token4=strtok(NULL," ");//body
printf("m.txt:token1:%s token2:%s token3:%s token4:%s\n",token1,token2,token3,token4);
if(msg_error==1 && strcmp(token,token2)==0){//message found
msg_error=0;
count=0;
pack.boxid=htons(count);
strcpy(pack.uname,token1);
strcpy(pack.subject,token3);
strcpy(pack.body,token4);
printf("pack:uname:%s subject:%s body:%s token:%s token2:%s strcmp:%d\n",pack.uname,pack.subject,pack.body,token,token2,strcmp(token,token2));
continue;
}
fprintf(fp1,"%s %s %s %s\n",token1,token2,token3,token4);
}
if(msg_error==1){
count=65534;
pack.boxid=htons(count);
}
printf("count:%u -> boxid:%u\n",count,pack.boxid);
fclose(fp);
fclose(fp1);
}
str[0]='c';
memcpy(&str[1],&pack.boxid,2);
memcpy(&str[3],pack.uname,8);
memcpy(&str[11],pack.subject,20);
memcpy(&str[31],pack.body,200);
str[231]='\0';
bytes=232;
}
}
فيما يلي M.TXT ، يتم استخدامه لتخزين المرسلين والمستقبلات والموضوعات والأجسام المسلحة: طقطق التسمية واضح تمامًا>.^
a b atob atobbody
a c atoc atoccc
b c btoc btoccccc
b a btoa btoaaaaa
لذلك أحاول تخزين MSG في M.TXT للمستلم "C" ، لكنه يتدفق ، وبالكثير من الصدفة ، فإنه يعيد MSG لـ "B" ...
المحلول
يبدو getmsg
يشير إلى الشخصية الثالثة لك str
متعادل:
`str` is "a b atob atobbody"
^
|
\__ `getmsg` is pointing there.
لذلك ، في كل مرة تتغير فيها str
بالاتصال fgets()
, ، تشير السلسلة إلى getmsg
يتغير أيضًا لأنه يستخدم نفس الذاكرة.