עבור לתוכן

תעזרו לי למצוא תבעיות - C.

Featured Replies

פורסם

/*Nir Ben Ezri 20/11/07 fileSort*/
#include "stdio.h"
#include "stdlib.h"

#define int SIZE 10

struct strc
{
int id;
int x;
};

typedef struct strc strct;


int fReadd(strct s[], int n, char* str);
int fSort(char* str);
void sScan(strct s[], int n);
void sPrint(strct s[], int n);


int main()
{
strct a[SIZE];
FILE *f;
char str[]="\\struct.txt"

sScan(a,SIZE);
//file write
f=fopen(str,"wb");

if(f==NULL)
{
printf("IO Error");
return 1;
}

fwrite(s, sizeof(strct), SIZE, f);
fclose(f);

fReadd(a,SIZE,"\\struct.txt");
sPrint(a,SIZE);

fSort(str);

fReadd(a,SIZE,"\\struct.txt");
sPrint(a,SIZE);
return 0;
}

void sPrint(strct s[], int n)
{
int i;
for(i=0;i<n;++i)
printf("id: %d\nx: %d\n-----------\n",s[i].id,s[i].x);
}

void sScan(strct s[], int n)
{
int i;
for(i=0;i<n;++i)
{
s[i].id=random(32000);
s[i].x=random(32000);
}
}

int fReadd(strct s[], int n, char* str)
{
FILE* f=fopen(str,"rb");

if(f==NULL)
return 0;

fread(&s, sizeof(strct), n, f);
fclose(f);

return 1;
}

int fSort(char* str)
{
strct tmp1,tmp2;
int i;
FILE* f=fopen(str,"a+b");

if(f==NULL)
return 0;

for(j=0;feof(f);++j)
{
for(i=0;feof(f);++i)
{
fseek(f,0,SEEK_SET);
fseek(f,j,SEEK_SET);
fread(&tmp1, sizeof(strct), 1, f);
fseek(f,0,SEEK_SET);
fseek(f,i,SEEK_SET);
fread(&tmp2, sizeof(strct), 1, f);
if(tmp1> tmp2)
{
fseek(f,0,SEEK_SET);
fseek(f,j,SEEK_SET);
fwrite(&tmp2, sizeof(strct), 1, f);
fseek(f,0,SEEK_SET);
fseek(f,i,SEEK_SET);
fwrite(&tmp1, sizeof(strct), 1, f);
}
}
}

close(f);

return(1);
}

מה הארורים?

[attachment deleted by admin]

פורסם

לא נכנסתי ממש לעומק, אבל כמה דברים ששמתי לב אליהם:

- לא צריך את ה int לפני ה SIZE ב define.

- ב main אתה שולח ל fwrite בפרמטר הראשון s כשלא הגדרת משתנה בשם s.

- ב fSort אתה משתמש באופרטור < כדי להשוות בין struct-ים. אתה לא יכול לעשות את זה, אתה צריך להשוות כל שדה בנפרד.

- ב fSort בסוף אני חושב שהתכוונת לקרוא ל fcolse אבל כתבת close.

פורסם
  • מחבר

תודה. מה שנשאר זה להבין למה זה עושה את עבודתו..

גם מה זה הרנדום המעפן הזה, מכל ה32000 אפשרויות הוא נותן לי כמה אותו דבר...

/*Nir Ben Ezri 20/11/07 fileSort*/
#include "stdio.h"
#include "stdlib.h"

#define SIZE 10

struct strc
{
int id;
int x;
};

typedef struct strc strct;


int fReadd(strct s[], int n, char* str);
int fSort(char* str);
void sScan(strct s[], int n);
void sPrint(strct s[], int n);


int main()
{
strct a[SIZE];
FILE *f;
char str[]="\\struct.txt";

sScan(a,SIZE);
//file write
f=fopen(str,"wb");

if(f==NULL)
{
printf("IO Error");
return 1;
}

fwrite(a, sizeof(strct), SIZE, f);
fclose(f);

fReadd(a,SIZE,"\\struct.txt");
sPrint(a,SIZE);

fSort(str);

fReadd(a,SIZE,"\\struct.txt");
sPrint(a,SIZE);
getch();
return 0;
}

void sPrint(strct s[], int n)
{
int i;
for(i=0;i<n;++i)
printf("id: %d\nx: %d\n-----------\n",s[i].id,s[i].x);
}

void sScan(strct s[], int n)
{
int i;
for(i=0;i<n;++i)
{
s[i].id=random(32000);
s[i].x=random(32000);
}
}

int fReadd(strct s[], int n, char* str)
{
FILE* f=fopen(str,"rb");

if(f==NULL)
return 0;

fread(&s, sizeof(strct), n, f);
fclose(f);

return 1;
}

int fSort(char* str)
{
strct tmp1,tmp2;
int i,j;
FILE* f=fopen(str,"a+b");

if(f==NULL)
return 0;

for(j=0;feof(f);++j)
{
for(i=0;feof(f);++i)
{
fseek(f,0,SEEK_SET);
fseek(f,j,SEEK_SET);
fread(&tmp1, sizeof(strct), 1, f);
fseek(f,0,SEEK_SET);
fseek(f,i,SEEK_SET);
fread(&tmp2, sizeof(strct), 1, f);
if(tmp1.id> tmp2.id)
{
fseek(f,0,SEEK_SET);
fseek(f,j,SEEK_SET);
fwrite(&tmp2, sizeof(strct), 1, f);
fseek(f,0,SEEK_SET);
fseek(f,i,SEEK_SET);
fwrite(&tmp1, sizeof(strct), 1, f);
}
}
}

fclose(f);

return(1);
}

פורסם

לגבי ה random אני חושב שאתה צריך קודם לקרוא ל randomize לפני שאתה משתמש ב random (אלה לא פונקציות סטנדרטיות אלא ספציפיות של בורלנד אם אני לא טועה). אגב, עדיף להשתמש בפונקציות הסטנדרטיות (rand ו srand לאתחול ה seed).

אם יש עוד בעיות תפרט אותן ואת מה שהתוכנית אמורה לעשות ונראה איפה הבעיה.

פורסם
  • מחבר

בגדול היא אמורה למיין קובץ.

ואני עכשיו רואה שהערך של STR ב fReadd משתנה. ואני לא רואה איפה או איך..

ניסיתי לשנות את זה לCONST וזה עדין משתנה, זה מתחיל בשורה הזו

fread(&s, sizeof(strct), n, f);

שמה הוא נהפך למשהו ארוך וכהתוכנית חוזרת לMAIN הוא נהפך למחרוזת ריקה.

מעבר לזה גם כאשר אני רושם מחרוזת בכל מקום שצריך לרשום התוכנית עדין לא ממינת את הקובץ.

פורסם

בקשר למיון - אני ממליץ לך לקרוא קודם מתוך הקובץ, למיין את זה בתוך מערך, ורק אז להעתיק בחזרה לקובץ.

בקשר למחרוזת - אנא תאר את הבעיה בצורה יותר ברורה.(צילום של חלון הWATCH לפני ואחרי + מספרי השורה שעליהם הוא עומד יכול להיות טוב).

פורסם
  • מחבר

כל הרעיון זה למיין בלי מערך עזר.. אלא רק מקובץ.

בקשר למחרוזת אני יעלה תמונות מחר, אני עף לישון.

פורסם

זה יהיה מאוד מאוד איטי. ההארד דיסק הרבה הרבה יותר איטי מה ram. הרבה יותר יעיל לטעון את כל הקובץ לזכרון, למיין אותו ולכתוב אותו בחזרה.

לגבי הבעיות שיש לך: תנסה להוריד את ה & מה s, הרי fread מקבלת מצביע ו s הוא למעשה מצביע.

עוד דבר: fseek מקבלת בפרמטר השני את מספר הבתים שיש לזוז (ה offset) ואתה שולח פשוט את i ו j אבל אם הגודל של ה struct שלך גדול מבית אחד אתה לא תתקדם למקום שרצית. תנסה להכפיל את i ו j שאתה שולח שם ב sizeof(strct).

פורסם
  • מחבר

כמובן, שטות טיפשית - הוספתי את הSIZEOF

תמונות:

[attachment deleted by admin]

פורסם

זה יהיה מאוד מאוד איטי. ההארד דיסק הרבה הרבה יותר איטי מה ram. הרבה יותר יעיל לטעון את כל הקובץ לזכרון, למיין אותו ולכתוב אותו בחזרה.

כשאתה פותח קובץ הוא נטען ל-RAM, ככה שזה לא באמת משנה.
פורסם

הוא נטען לVM(*), ואם צריך לRAM.

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

עבודה ישירה על הRAM לא מחייבת כתיבה מרובה לדיסק(*, מכיוון שאם המחשב נכבה המידע שם כבר לא חשוב), ולכן זה יהייה מהיר יותר.

* - הVM נמצא על ההארדיסק.

פורסם

אחי תעשה הזחה.. זה תמיד עוזר למצוא את הטעות בשניה

פורסם
  • מחבר

הכל מוזח, זה לא קשור אני רואה את הבעיה פשוט לא מבין למה היא נגרמת. מה גם שהמשתנה הוא CONST כאילו איך לעזאזל היא משתנה.

פורסם

תוריד את ה & מלפני ה s בקריאה ל fread.

אבל יש לך בעיות בפונקציית מיון שלך:

- אתה שולח "a+b" כפרמטר ל fopen מה שגורם לכך שכל פעולת כתיבה תתבצע לסוף הקובץ (a הוא עבור append). אתה צריך לשלוח "r+b".

- בתנאי של הלולאות כתבת feof(f) מה שאומר שהלולאות בכלל לא יתבצעו (כי זה לא סוף הקובץ). בטח התכוונת ל feof(f)!.

- אם אני לא טועה יש לך בעיה מבחינה בסיסית. כשעושים bubble sort (שאני מניח שזה מה שהתכוונת לעשות) משווים בין שני איברים סמוכים. מה שאתה עושה כרגע זה לקחת איבר (במקום ה i) ולהשוות אותו מול השאר. אתה יכול לקרוא על זה כאן:

http://linux.wku.edu/~lamonml/algor/sort/bubble.html

- אין צורך בכל הקריאות ל fseek עם 0 הרי SEEK_SET מציין שאתה מתחייס לתחילת הקובץ ולכן זו סתם פעולה מיותרת (שבעצם מאטה את התוכנית).

תנסה את זה (כדי שיהיה קצת יותר יעיל כתבתי את הלולאה הפנימית ככה שתרוץ בקפיצות של גודל ה strcut):

int fSort(char* str)
{
strct tmp1, tmp2;
int sizeOfStrct = sizeof(tmp1);
int i,j, byteCount;

FILE* f = fopen(str, "r+b");
if( f == 0 )
return 0;

for(i=SIZE; i >= 0; --i)
{
byteCount = sizeOfStrct*i;
for(j=sizeOfStrct;j <= byteCount;j += sizeOfStrct)
{
fseek(f,j-sizeOfStrct,SEEK_SET);
fread(&tmp1, sizeOfStrct, 1, f);
fseek(f,j,SEEK_SET);
fread(&tmp2, sizeOfStrct, 1, f);

if(tmp1.id> tmp2.id)
{
fseek(f,j-sizeOfStrct,SEEK_SET);
fwrite(&tmp2, sizeOfStrct, 1, f);
fseek(f,j,SEEK_SET);
fwrite(&tmp1, sizeOfStrct, 1, f);
}
}
}

fclose(f);

return 1;
}

ארכיון

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

דיונים חדשים