בעיה בקריאת קובץ - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

בעיה בקריאת קובץ


SweeT_EviL

Recommended Posts

בגדול זה לא עובד.

int s3Dsudoko(queb q)
{
FILE *sudoko=fopen("c:\\S3D.txt", "r");
mat m={0};
vec v={0};
char x;
int i,j,k;

if(sudoko==0)
{
printf("IO Error.\n");
return(0);
}

for(k=0;k<9;++k)
{
x=fgetc(sudoko);
if (x!=EOF)
{
for(i=0;i<9;++i)
{
for(j=0;j<9;++j)
{
if (x!='\n' && x!=' ' && x!=EOF)
setCell(v,j,(int)x);
else
--j;
x=fgetc(sudoko);
}
setVec(m,i,v);
}
setMat(q,i,k,m);
}
}
fclose(sudoko);
return(1);
}

typedef int vec[9];

int setCell(vec v, int culomn, int num)
{
v[culomn]=num;
return(1);
}

typedef vec mat[9];

int setVec(mat m, int row, vec v)
{
int i;
for(i=0;i<9;++i)
setCell(m[row],i,getCell(v,i));
return(1);
}

typedef mat queb[9];

int setMat(queb q, int row, int deep, mat m)
{
int x;
for(x=0;x<9;++x)
{
setVec(q[deep],row,*(getVec(m,row)));
}
return(1);
}

קישור לתוכן
שתף באתרים אחרים

typedef int vec[9];

קובץ TXT של מספרים בלבד (9 מטריצות של 9X9 של מספרים מ1-9).

וGETC אני יודע שהוא לוקח תו תו כמו שאני צריך צריך. FSCANF אני לא מכיר אותו אבל זה נשמע ליותר מתו אחד...

להחליף לFSCANF?

קישור לתוכן
שתף באתרים אחרים

fgetc קורא את הערך המספרי (ערך ה-ASCII) של הבתים בתוך הקובץ.

כלומר, אם, נניח, נמצא בקובץ התו '1' ואתה קורא אותו לתוך x, אז x יכיל את הערך '1', שערכו המספרי הוא 49. ערכו המספרי של '2' הוא 50, וכן הלאה.

לכן אתה צריך לבצע את ההמרה של x מתו '1' לערכו המספרי 1, באחת משתי דרכים:

א. להמיר אותו ל-int ולהפחית את הערך של '0' מערכו.

ב. להשתמש בפונקציות המרה של מחרוזות למספרים (יותר מסובך, פחות מומלץ כאן).

קישור לתוכן
שתף באתרים אחרים

fgetc קורא את הערך המספרי (ערך ה-ASCII) של הבתים בתוך הקובץ.

כלומר, אם, נניח, נמצא בקובץ התו '1' ואתה קורא אותו לתוך x, אז x יכיל את הערך '1', שערכו המספרי הוא 49. ערכו המספרי של '2' הוא 50, וכן הלאה.

לכן אתה צריך לבצע את ההמרה של x מתו '1' לערכו המספרי 1, באחת משתי דרכים:

א. להמיר אותו ל-int ולהפחית את הערך של '0' מערכו.

ב. להשתמש בפונקציות המרה של מחרוזות למספרים (יותר מסובך, פחות מומלץ כאן).

אתה מתכוון ככה:

setCell(v,j,((int)x)-48);

או שצריך /10 ..?

יש לך רווחים בין הספרות?

עריכה:

עכשיו זה מכניס לי ערכים הגיונים רק בסדר מוזר בטירוף.

כן והתחשבתי בזה בIF

if (x!='\n' && x!=' ' && x!=EOF)
setCell(v,j,(int)x);
else
--j;

קישור לתוכן
שתף באתרים אחרים

סבבה זה עובד, תודה לכולם!. אשמח לאיזה הסבר קצר למה הGETS לא היה טוב(כי לי טיפול במקרה של רווח) ולמה השימוש בEOF לא טוב במקרה שלי.

בנוסף כשאני מנסה להדפיס את הטיפוס ששלחתי לפונקציה הזו הוא לא מדפיס ערכים טובים (ליתר דיוק שורה של מספרים מ5 תווים וכל השאר 0). ניסיתי לשלוח לפונקציה כתובת וזה לא הצליח.

בנוסף מצורף פה התיקון לפונקציה שלי לאלה שבעתיד יבצעו חיפוש, אולי זה יעזור לכם.

int s3Dsudoko(queb q)
{
FILE *sudoko=fopen("c:\\S3D.txt", "r");
mat m={0};
vec v={0};
char x;
int i,j,k;

if(sudoko==0)
{
printf("IO Error.\n");
return(0);
}


for(k=0;k<9;++k)
{
fscanf(sudoko,"%c",&x);
if(!feof(sudoko))
{
for(i=0;i<9;++i)
{
for(j=0;j<9;++j)
{
if (x!='\n' && x!=' ' && (!feof(sudoko)))
setCell(v,j,((int)x)-48);
else
--j;
fscanf(sudoko,"%c",&x);
if(feof(sudoko))
{
fclose(sudoko);
return(1);
}
}
setVec(m,i,v);
}
setMat(q,i,k,m);
}
else
{
fclose(sudoko);
return(1);
}
}
fclose(sudoko);
return(1);
}

עריכה:

תודה לכולם הסתדרתי.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...