سؤال

وأنا أحاول جمع المعلومات من ملف نصي الذي يحتوي على أسماء المنظمات (دون المسافات) والأعداد الصحيحة العائمة. أريد لتخزين هذه المعلومات في بنية مجموعة.

والمشكلة أواجه حتى الآن هو جمع المعلومات. هنا هو عينة من ملف نصي:

<اقتباس فقرة>   

وCBA 12.3 4.5 7.5 2.9 4.1

     

وTLS 3.9 1 8.6 12.8 4.9

وأنا يمكن أن يصل إلى 128 أرقام مختلفة لكل منظمة، وتصل إلى 200 منظمة في ملف نصي.

وهذا هو ما يبدو هيكل بلدي مثل حتى الآن:

struct callCentre
{
char name[256];
float data[20];
};

واهتمامي الرئيسي:

int main()
{
callCentre aCentre[10];
getdata(aCentre);
calcdata(aCentre);
printdata(aCentre);
return 0;
}

ووظيفة getdata:

void getdata(callCentre aCentre[])
{
ifstream ins;
char dataset[20];

cout << "Enter the name of the data file: ";
cin >> dataset;

ins.open(dataset);

if(ins.good())
{
    while(ins.good())
    {
        ins >> aCentre[c].name;
        for(int i = 0; i < MAX; i++)
        {
            ins >> aCentre[c].data[i];
            if(ins == '\n')
                break;
        }
        c++;
    }
}
else
{
    cout << "Data files couldnt be found." << endl;
}
ins.close();
}

ما أحاول تحقيقه في بلدي وظيفة getdata هو هذا: تخزين اسم المؤسسة لأول مرة في الهيكل، ثم قراءة كل تطفو في مجموعة البيانات حتى يكتشف البرنامج بايت السطر الجديد. ومع ذلك، حتى الآن بلدي الاختيار للبايت السطر الجديد لا يعمل.

وافترض أن المتغيرات <م> ج و <م> MAX تعرف بالفعل.

وكيف يجب أن تذهب نحو هذا صحيح؟

هل كانت مفيدة؟

المحلول

char byte = ins.peek();

أو

if(ins.peek() == '\n') break;

و(تحرير): أنت تريد أن تحقق أيضا لالفولكلوري بعد نظرة خاطفة الخاص بك ()، لأن بعض الملفات قد لا يكون السطر إنهاء

وأود أن أشير إلى أن قد ترغب في النظر في استخدام vector<callCentre> بدلا من مجموعة ثابتة. إذا تجاوز طول ملف الإدخال قدرة مجموعة، عليك السير في جميع أنحاء المكدس.

نصائح أخرى

والمشغل >> يعامل بيضاء كما هو محدد، وهذا يشمل أسطر جديدة، لذلك فقط يأكل هؤلاء وأنت لا نراهم.

وكنت بحاجة لقراءة خطوط ثم ختم يصطف. بت التالية من hackery يوضح الفكرة الأساسية:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main() {
    string line;
    while( getline( cin, line ) ) {
        istringstream is( line );
        string cs;
        is >> cs;
        double vals[10];
        int i = 0;
        while( is >> vals[i] ) {
            i++;
        }

        cout << "CS: " << cs;
        for ( int j = 0; j < i; j++ ) {
            cout << " " << vals[j];
        }
        cout << endl;
    }
}

وأود أن قراءة ملف سطر واحد تلو الآخر وتحليل كل خط على حدة للقيم:

std::string line;
while (std::getline(ins, line)) {
  std::istringstream sline(line);
  sline >> aCentre[c].name;
  int i = 0;
  while (sline >> aCentre[c].data[i])
    i++;
  c++;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top