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

קובץ טקסט שמכיל את כל המספרים מ-0 עד 1000000000


koby058

Recommended Posts

הכי פשוט, start > run > cmd.

שם תרשום:

echo off
for /l %p IN (0,1,1000000000) Do echo %p >> bla.txt

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

אבל סביר להניח שזה ייקח הרבה הרבה זמן (והגודל של הקובץ יהיה יותר מ-10 ג'יגה).

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

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

קוד קצר ב C# שעושה את העבודה:


StreamWriter S = new StreamWriter(@"C:\O.txt");
for (Int64 i = 1; i < 1000000000+1; i++)
{
S.WriteLine(i);
S.Flush();
S.BaseStream.Seek(0,SeekOrigin.End);
}

אולי לא הכי יעיל בעולם, אפשר לעשות Flush כל מספר פעמים ולא כל פעם, אבל עובד.

עריכה: אני רואה שהציעו שיטות קצת יותר משוכללות משלי, יפה יפה. נחמד ללמוד קצת על פקודות בקבצי batch מדי פעם.

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

כמו שציינתי, ב-batch זה מאוד לא יעיל (ניסיתי להריץ על 10000, לקח איזה חצי דקה.... אז אני מניח שאם רוצים פי 100000 מזה זה ייקח איזה חודש).

חוץ מזה, כמו שכבר אמרתי - הקובץ הסופי יהיה ענק, יותר מ-10 ג'יגה.

זה שמעליי - למה לעשות flush בכלל? ולמה לעשות seek?

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

אם לא עושים flush, לא מתבצעת כתיבה לקובץ. לגבי ה Seek , אני לא בטוח אם זה נחוץ כל איטרציה, אבל הייתה לי בעיה עם זה פעם, ככה שלא רציתי להסתבך שוב.

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

א. לרוב אחרי WriteLine יבוצע flush אוטומטית (אני זוכר שזה ככה ב-C, יכול להיות שב-#C זה אחרת).

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

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

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

פשוט מאוד בהנחה שאתה יודע שפת תיכנות כלשהי אפילו רק את הבסיס, פשוט תעשה לולאה(for מתאימה למקרה זה), תאתחל משתנה ל-0 וכל פעם שהתוכנית תבדוק אם המשתנה קטן או שווה למספר שאתה רוצה להגיע אליו, ואם זה קטן או שווה תקדם את הערך ב1(++) והפקודה הבאה תדפיס את הערך של המשתנה

עד אשר תגיע למספר המבוקש בהצלחה :xyxthumbs:

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

מה זה בכלל flush?

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

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

הפעולה flush מכריחה את התוכנה לכתוב את מה שב-buffer לתוך הקובץ.

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

ארכיון

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

×
  • צור חדש...