c ++ כיצד לקרוא קובץ במערך


תשובה 1:

C ++ משתמש ב- I / O סטנדרטי C כדי לגשת לקבצים. אז קוד C יעבוד בסדר גמור.

ל- C ++ יש כמה חפצי iostream נחמדים שעושים חבורה של דברים נחמדים בדרך זו.

זה עוזר לדעת את פורמט הקובץ. האם אתה קורא פסיקים מספרים מפושטים, מופרדים רווחים או אחד לשורה?

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

התשובה של מייקל באוארס טובה, אך חסר הסבר.

לפתוח קובץ לקרוא טקסט להמיר טקסט למספר להוסיף למיכל. סגור קובץ

הלקח שלי:

צור אופרטור להזנת מספרים מקובץ לווקטור.

ליצור מספר וקטור קובץ פתוח החל יישום אופרטור למילוי וקטור סגור שימוש בקובץ

// ליצור אופרטור >> לעבוד עם וקטור ו- istream std :: istream & operator >> (std :: istream & in, std :: vector & v){ כפול ד; ואילו (ב >> ד) // ifstream מבצע טקסט-> המרה כפולהv.push_back (ד); // הוסף לווקטור לחזור פנימה; // מחזירה את הסטרם עצמו} // להכין וקטור להחזקת זוגותstd :: וקטור המספרים שלי;std :: ifstream inputFile {"file.txt"}; // {} הוא תחביר 'רשימת אתחול' בעוד (inputFile)inputFile >> המספרים שלי; // הזן את כל המספרים עד לסיוםinputFile.close (); // סגור את הקובץ// עכשיו הווקטור נטען, הקובץ סגור - מוכן.

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


תשובה 2:

שאלה: כיצד אוכל לקרוא מספרים בקובץ טקסט במערך ב- C ++?

וואו 3 תשובות לבקשות משלושה אנשים שונים על כל אותה שאלה. מוּזָר! נראה כמעט שמשהו מישהו יכול היה לחפש בגוגל כדי לקבוע את התשובה במקום לשאול גם את Quora. אני לא צריך לחפש בגוגל - אני יכול לכתוב את הקוד מהזיכרון ומדעי:

#לִכלוֹל #לִכלוֹל #לִכלוֹל באמצעות std namespace;int main (int argc, char ** argv){ ifstream in ("file.txt", ifstream :: in);וֶקטוֹר lstNumbers; בעוד ((! in.eof ()) && in) { int iNumber = 0; ב >> iNumber; lstNumbers.push_back (iNumber); } בקרוב(); // מה אתה רוצה לעשות עם המספרים האלה ???}

אוקי שיקרתי - הייתי צריך לחפש בגוגל את הפניה C ++ למחלקה הווקטורית כי בכנות אני אף פעם לא משתמש בה. אני עובד עם מסגרת ה- QT שיש לה מחלקות משלה לכל מבני הנתונים (רשימה, מפה, סט וכו '). בנוסף, בדרך כלל אני לא עובד עם קבצי I / O - אני עובד בג'אווה בעיקר במקצועיות וגם שם אני לא עובד עם קבצים למעט כמו קבצי JSON ו- XML ​​ולגבי אלה יש ספריות שממצות דברים עבור המתכנת. כך שלא צריך לדאוג לפתיחה, סגירה או קריאה של חלקים מתוך הקובץ. אבל זה צריך לעשות את הטריק בשבילך אני מאמין.

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


תשובה 3:

משהו כזה.

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

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

#לִכלוֹל #לִכלוֹל #לִכלוֹל #לִכלוֹל באמצעות std namespace;int main () { ifstream myfile ("d: \\ numbers.txt"); אם (myfile.is_open ()) { int arrSize = 0;מַעֲרָך arr; // באופן אידיאלי זה יהיה וקטור, אבל אמרת מערך בעוד (נכון) { int x; myfile >> x; if (myfile.eof ()) לשבור; arr [arrSize ++] = x; } עבור (int i = 0; i cout << arr [i] << ""; cout << endl; // הייתי צריך לסגור את הקובץ כאן, אבל כשהתוכנית הסתיימה הייתי עצלן} אַחֵר { cout << "לא ניתן לפתוח את הקובץ"; } החזר 0;}

תשובה 4:

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

std :: קלט ifstream ("numbers.txt");std :: וקטור מספרים {std :: istream_iterator (קלט), {}};

(עבור "T" = איזה סוג שתרצו לקרוא - int, double, float וכו ')

אם הקובץ שלך עשוי להכיל "זבל" נוסף בין המספרים, אתה עדיין יכול בדרך כלל לעשות את אותו הדבר אם אתה רוצה. Istream_iterator הוא בעצם מתאם המשתמש במפעיל >> לקריאת פריטים מהזרם. זה, בתורו, מתעלם מהמרחב הלבן, אז משהו כמו '1 2 'יקרא כ 1 ואחריו 2.

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

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

struct digits_only: std :: ctype {digits_only (): std :: ctype (get_table ()) {} סטטי סטטי :: ctype_base :: מסכת const * get_table () { // ראשית, צור טבלה שאומרת שהכל חלל לבן: std std :: וקטור rc (std :: ctype :: table_size, std :: ctype_base :: space); // ואז הגדר את הספרות כאל ספרות בפועל: אם (rc ['0'] == std :: ctype_base :: space) std :: fill_n (& rc ['0'], 9, std :: ctype_base :: mask ()); // להחזיר את הטבלה כדי לסווג תווים בהתאם: החזר & rc [0]; }};

לאחר מכן אנו אומרים לזרם להשתמש באזור זה ולקרוא נתונים מהזרם:

int main () { std :: קלט istringstream (R "(11 זבל 1.00 יותר זבל 16.0 עוד יותר זבל 1.999! @ # $$% ^ $% & * סוף סוף הסתיים)"); input.imbue (std :: locale (std :: locale (), ספרות חדשות בלבד));std :: וקטור מספרים {std :: istream_iterator (קלט), {}};}

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


תשובה 5:

אתה יכול לקרוא את המספרים בקובץ txt לפי הקוד הבא.

#לִכלוֹל

#לִכלוֹל

#לִכלוֹל

ריק ראשי ()

{char ch; int a; int arr [[30]; int i = 0;

ifstream f1 ("abc.txt");

בעוד (! f1.eof ())

{

fi >> ch;

a = static_cast ch;

arr [i] = a;

}

f1.close ();

getch ();

}

תוכנית זו קוראת קובץ טקסט שלפי ההנחה שהוא כבר נוצר לפני תוכנית זו, מכיוון שהקובץ בפורמט txt כך שנאחסן מספר אחד למשתנה char כיוון שמשתנה שהקלדת char יכול לאחסן תווים ואז נשתמש בפונקציה static_cast () כדי הטיל את ערך התו לערך שהוקלד מספר שלם והכנס אותו ל int a ואז נשתמש במשתנה כדי לאחסן את הערך שלו במערך אחד אחד.

תודה …..


תשובה 6:

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

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


תשובה 7:

נניח שיש לך קובץ כלומר input.txt, אתה יכול להשתמש בקטעי הקוד הבאים כדי לקרוא מספרים שלמים מהקובץ. מקווה שזה עוזר :-)

#לִכלוֹל באמצעות std namespace;const int sz = 1001; // הגדר את sz לגודל המרבי של המערךמערך int [sz];int main (){ freopen ("input.txt", "r", stdin); אינדקס int = 0, מספר; /// סריקה עד סוף הקובץ בעוד (scanf ("% d", & num) == 1) { מערך [אינדקס ++] = מספר; } עבור (int i = 0; i printf ("% d", מערך [i]); printf ("\ n"); החזר 0;}

תשובה 8:

אולי תרצה להתחיל ללמוד לתכנת ...

לכן קובץ הטקסט מכיל ספרות (ASCII 48..57, אולי 'e' ו- '-' ו- '.') ומפרידים (ASCII 13,10,9,32, מה שהרעל שלך יהיה).

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

אתה יודע למה השכר שלי גבוה? כי עשיתי את זה לבד, השקעתי זמן רב ומעסיקים יודעים זאת.


תשובה 9:

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


תשובה 10:

הדרך C הקלאסית תהיה שימוש ב- fscanf

דרך C ++ יכולה להיות שימוש ב- ifstream יחד עם stringstream.

אולי אפילו לא תזדקק לזרם המיתרים.