PDA

View Full Version : مشكل اين قطعه از برنامه چيه؟



Pari_Programmer
دوشنبه 03 خرداد 1389, 18:19 عصر
با سلام.
من ميخوام يه برنامه بنويسم كه تعدادي كلمه رو از توي يه فايل بخونه و اون رو به ليست اضافه كنه. اون قسمتي از برنامه كه مربوط به خوندن فايل و اضافه كردن به ليسته رو اينجوري نوشتم:



typedef struct List
{
wstring Token;
List *next;
};

void LoadFile()
{
ifstream InputFile( "InTest.txt" );
ofstream OutputFile( "OutTest.txt" );
if(!InputFile || !OutputFile)
{
cout<<"Error."<<endl;
exit(0);
}
wstring InSent=L"";
List *root = (List *)malloc(sizeof(List));
root=NULL;
while(!InputFile.eof())
{
InputFile>>InSent;
List *Temp;
Temp= (List*)malloc(sizeof(List));
Temp->Token=InSent;

Temp->next=root;
root = Temp;
}

در ظاهر همه چيز بايد درست كار كنه. اما وقتي برنامه رو اجرا ميكنم، به اين خط كه ميرسه:


Temp->Token=InSent;

اين خطا رو صادر ميكنه:


Unhandled exception at 0x1026edac (msvcr90d.dll) in UTF8Manipulator.exe: 0xC0000005: Access violation writing location 0xcdcdcdcd.

كسي ميدونه اشكال كار كجاست و چيكارش بايد كرد؟
با string هم امتحان كردم ديدم همين مشكل رو داره. با wchar_t* و char* هم اوضاع همينه.:ناراحت:
ولي وقتي با int كار ميكنم جواب ميده. هرچي هست اشكال توي كار با رشته هاست. اما چرا و چه جوري ميشه درستش كرد؟
راستي اين رو هم بگم كه براي مقدار دهي به Temp->Token‌از راههاي مختلفي استفاده كردم مثل استفاده از assign و انتساب معمولي. ولي همه به همون پيغام خطا ختم ميشد.

حامد مصافی
دوشنبه 03 خرداد 1389, 18:47 عصر
ifstream InputFile( "InTest.txt" );

لطفاً خط فوق را به خطوط ذيل جايگزين كرده و نتيجه را اعلام فرمائيد.

ifstream InputFile( "InTest.txt" , ifstream::in );
if(InputFile
== NULL)
{
printf("error opening file!");

return -1;
}

Pari_Programmer
دوشنبه 03 خرداد 1389, 19:08 عصر
سلام آقا حامد.

مشكل من توي اين قسمت كه شما فرموديد نيست. چون وقتي برنامه رو trace ميكنم، متغير InSent مقدار ميگيره و اتفاقا درست هم مقدار ميگيره. اين چيزي كه شما فرموديد مربوط ميشه به زمان خوندن از فايل نه زمان انتساب رشته به متغير. من براي تست اين مسئله حتي اومدم و خوندن از فايل رو حذف كردم. برنامه رو اينجوري تست كردم:


typedef struct List
{
wstring Token;
List *next;
};

void LoadFile()
{
wstring InSent=L"test";
List *root = (List *)malloc(sizeof(List));
root=NULL;
root->Token=InSent;
}

باز هم مشكل سر جاش بود و همون پيغام خطا صادر ميشد. گفتم، مشكل از انتساب به متغير رشته ايه. اما چرا و راه حلش چيه نميدونم....

pashaie
دوشنبه 03 خرداد 1389, 19:42 عصر
مشکل شما مربوط به متغییر Temp که به نظر درست مقدار دهی نشده. تو تریس کردن بعد از دستور malloc، متغییر Temp مقدار معتبری داره؟

راستی چرا از malloc استفاده می کنی؟
malloc برای C درست بود ولی الان تو دنیای c++ یه جورایی منسوخ شده!

به جای این خط:

List *root = (List *)malloc(sizeof(List));
بنویس

List *root = new List;

pashaie
سه شنبه 04 خرداد 1389, 00:41 صبح
این کد کار می کنه


#include "stdafx.h"
#include <string>
#include <iostream>

using namespace std;

typedef struct List
{
wstring Token;
List *next;
};


void LoadFile2()
{
wstring InSent=L"Cool!";
List *root = new List;
root->Token=InSent;
wcout << root->Token;
}


int _tmain(int argc, _TCHAR* argv[])
{
LoadFile2();
cin.get();
return 0;
}