עבור לתוכן

C# - מנסה לכתוב לקובץ בינארי ולא מצליח

Featured Replies

פורסם

יש לי תרגיל שמקבל עובדים עם כל הפרמטרים (שם, גיל וכו')

אני מנסה לכתוב עובד מסויים ב-MAIN לתוך קובץ בינארי וזה לא כותב לי כלום, כל שאר התרגיל עם המתודות הכל עובד בסדר אז צירפתי רק את השורות הרלוונטיות ב-MAIN, פשוט יצרתי עובד ואני רוצה לראות אם ה-ID שלו לצורך הדוגמא נכתב בקובץ.

        DateTime birthDate1 = new DateTime(1966, 1, 1);
Employee moshe = new Employee(101, "moshe", birthDate1);


FileStream file1 = new FileStream("employees.bin", FileMode.Create, FileAccess.Write);
BinaryWriter brEmployees_1 = new BinaryWriter(file1);


brEmployees_1.Write(moshe.Id);

פורסם

אתה צריך לעשות Close ב-writer או ב-stream (לא זוכר בע"פ), עד שאתה לא סוגר שום דבר לא נכתב.

פורסם
  • מחבר

נכון, תודה רבה.

פורסם

לא חייבים לעשות Close, מספיק לעשות Flush (וככה הקובץ לא נסגר).

בכל מקרה, i've said it before and i'll say it again:

תמיד תמיד תמיד תמיד תמיד כשעובדים עם Streams (ובכלל עם מחלקות שמממשות את הממשק IDisposable), לזכור לעשות Dispose לאובייקט בסיום העבודה איתו, או אפילו יותר טוב להשתמש ב-using, דהיינו:


using (FileStream file1 = new FileStream("employees.bin", FileMode.Create, FileAccess.Write))
{
using (BinaryWriter brEmployees_1 = new BinaryWriter(file1))
{

brEmployees_1.Write(moshe.Id);

// any more code the writes to the file goes here
}
}

פורסם
  • מחבר

מה זה Dispose ?

אני מכניס נתונים כמו משתמש וקולט נתונים של עובד (שם, ID ותאריך לידה), כשאני מדפיס את הנתונים אז התאריך לא יוצא לי טוב למשל אם הכנסתי את המספר 1999/12/12 אז הוא מדפיס לי 12552 ואין לי מושג מאיפה הוא בא (לבנתיים אני מדפיס רק את השנה), אגב בכדי להחזיק את הנתונים של כל עובד בניתי 3 מערכים, האם יש דרך שימושית יותר ?

אני מצרף את ה-MAIN:

Console.Write("Enter Employees Number You Want To Save: ");
int EmpNum = int.Parse(Console.ReadLine());
int count = 0;
FileStream EmployeesFile = new FileStream("employees.bin", FileMode.Create, FileAccess.Write);
BinaryWriter BrFile = new BinaryWriter(EmployeesFile);
string stBirthday = "";


while (count < EmpNum)
{
Console.Write("Enter Emploee Name: ");
string EmpName = Console.ReadLine();


Console.Write("Enter Emploee ID: ");
int EmpID = int.Parse(Console.ReadLine());


Console.Write("Enter Employee Birthday In Format YYYY/MM/DD: ");
string EmpBirth = Console.ReadLine();


for (int i = 0; i < EmpBirth.Length; i++)
{
if (EmpBirth[i] != '/')
{
stBirthday += EmpBirth[i];
}
}


BrFile.Write(EmpName);
BrFile.Write(EmpID);
BrFile.Write(stBirthday);
count++;
}


BrFile.Close();


FileStream EmployeesFile2 = new FileStream("employees.bin", FileMode.Open, FileAccess.Read);
BinaryReader brReadFile = new BinaryReader(EmployeesFile2);


string[] NamesArray = new string[count];
int[] IdArray = new int[count];
short[] DateArray = new short[count];


for (int i = 0; i < count; i++)
{
NamesArray[i] = brReadFile.ReadString();
IdArray[i] = brReadFile.ReadInt32();
DateArray[i] = brReadFile.ReadInt16();
}


for (int i = 0; i < count; i++)
{
Console.WriteLine("Name: " + NamesArray[i] + " " + "ID : " + IdArray[i] + " " + "Birthday: " + DateArray[i]);


}


BrFile.Close();


Console.ReadLine();

פורסם

אוי ויי... איזה מין מקור מלמד על קבצים בלי ללמד מה זה Dispose?

לשאלתך: כידוע, דוטנט היא פלטפורמה "managed", כלומר היא מנהלת עבורך את השימוש במשאבים מסויימים - בעקרון, זכרון (כלומר, אתה לא צריך לדאוג לשחרר אובייקטים מהזכרון). אבל מה, יש משאבים מסויימים שלא מנוהלים ע"י הפלטפורמה - כגון קבצים, או חיבורים למשאבים חיצוניים (כמו מסדי נתונים וחיבורי רשת).

בד"כ למחלקות המייצגות משאבים כאלה (לדוגמה, FileStream) יש מתודה שסוגרת אותם (לדוגמה, Close). אבל בשביל האחידות והנוחות, כל מחלקה שמייצגת משאב שאינו מנוהל, מממשת את הממשק IDisposable ומספקת למשתמש מתודה בשם Dispose, ש"נפטרת" מהאובייקט. תכלס, זה אומר שכל אובייקט שהוא Disposable, צריך (או לפחות, מומלץ) להפעיל את המתודה Dispose שלו ברגע שמסיימים את העבודה איתו.

בשביל לחסוך לנו עבודה (ובעיות במקרה של חריגות), השפה מאפשרת לעשות Dispose אוטומטי באמצעות הפקודה using (כפי שהסברתי בהודעה הקודמת). לא תמיד אפשר להשתמש ב-using (ספציפית, אפשר להשתמש בו רק אם כל העבודה שלך עם האובייקט מוגבלת לפונקציה אחת), אבל זה שימושי ברוב המקרים.

ולשאלתך השנייה: למה אתה קורא את יום ההולדת בתור int16, אם כתבת אותו בתור מחרוזת?

פורסם
  • מחבר

תודה על ההסבר.

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

פורסם
  • מחבר

איך בדיוק ? לא מצליח לי

פורסם

אם אתה כותב מחרוזת, אתה צריך לקרוא מחרוזת. אם אתה כותב int (שהוא בעצם int32) אתה צריך לקרוא int32. אם אתה כותב short (שהוא בעצם int16) אתה צריך לקרוא int16.

פורסם
  • מחבר

אוקיי תודה הבנתי, אגב אם אני רוצה להכניס בדיקות תקינות כמו למשל המספר הראשוני שאני מכניס שאומר כמה עובדים אני קולט איך אני יכול לרשום את זה שיזרוק לי הודעת שגיאה שהערך המוכנס הוא לא בפורמט הנכון (אם למשל לא הכנסתי מספר אלא גם אותיות שזה אסור) ?

אני עשיתי שהוא מקבל סטרינג בתור הקלט ואז עובר עליו תו תו ובודק אם זה לא מספר אז הוא זורק הודעה ואם כן זה מספר הוא ממיר אותו ל-INT וממשיך ופה יש לי 2 שאלות:

1. איך אפשר לפשט את זה כלומר להשאיר את הקלט בתור INT ופשוט לעשות IF פשוט ?

2. אם למשל כן גיליתי שהקלט לא חוקי איך אני יכול שתהיה הודעת שגיאה למסך ואז אפשרות שוב להכניס קלט חדש כי מה שאני עעשיתי זה שזה זורק EXCEPTION ויוצא:

יצרתי CLASS:


public class IncorrectParameters : ApplicationException
{
public IncorrectParameters(string message)
: base(message)
{
}
}


זה ה-MAIN:


Console.Write("Enter Employees Number You Want To Save: ");

string stEmpNum = Console.ReadLine();


for (int i = 0; i < stEmpNum.Length; i++)
{
if (stEmpNum[i] <= 0 && stEmpNum[i] > 9)
{
Console.WriteLine("Input string was not in a correct format");
}
}


int EmpNum = int.Parse(stEmpNum);
int count = 0;
FileStream EmployeesFile = new FileStream("employees.bin", FileMode.Create, FileAccess.Write);
BinaryWriter BrFile = new BinaryWriter(EmployeesFile);


while (count < EmpNum)
{
Console.Write("Enter Emploee Name: ");
string EmpName = Console.ReadLine();


Console.Write("Enter Emploee ID: ");
int EmpID = int.Parse(Console.ReadLine());


Console.Write("Enter Employee Birthday In Format DD/MM/YYYY: ");
string EmpBirth = Console.ReadLine();


BrFile.Write(EmpName);
BrFile.Write(EmpID);
BrFile.Write(EmpBirth);
count++;
}


BrFile.Close();


FileStream EmployeesFile2 = new FileStream("employees.bin", FileMode.Open, FileAccess.Read);
BinaryReader brReadFile = new BinaryReader(EmployeesFile2);


string[] NamesArray = new string[count];
int[] IdArray = new int[count];
string[] DateArray = new string[count];


for (int i = 0; i < count; i++)
{
NamesArray[i] = brReadFile.ReadString();
IdArray[i] = brReadFile.ReadInt32();
DateArray[i] = brReadFile.ReadString();
}


for (int i = 0; i < count; i++)
{
Console.WriteLine("Employee #" + (i+1) + " Name: " + NamesArray[i] + " " + "ID : " + IdArray[i] + " " + "Birthday: " + DateArray[i]);


}


BrFile.Close();


Console.ReadLine();

ארכיון

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

דיונים חדשים