سؤال

أقوم بتحليل بعض بيانات CSV في C لأغراض امتداد الياقوت. من أجل سحب البيانات من كل صف أستخدم SSCANF على النحو التالي:

  char* line = RSTRING_PTR(arg);
  double price;
  double volume_remaining;
  unsigned int type_id, range, order_id, volume_entered, minimum_volume, duration, station_id, region_id, solar_system_id, jumps;
  char* issued;
  char* bid;
  printf("I got %s\n",line);
  int res = sscanf(line, "%lf,%lf,%u,%u,%u,%u,%u,%s,%s,%u,%u,%u,%u,%u", &price, &volume_remaining, &type_id, &range, &order_id, &volume_entered, &minimum_volume, bid, issued, &duration, &station_id, &region_id, &solar_system_id, &jumps);
  printf("I matched %d values\n", res);
  printf("I have price %f, vol_rem %f, type_id %d, range %d, order_id %d, vol_ent %d, min_vol %d, issued %s, bid %s, duration %d, station_id %d, region_id %d, solar_system_id %d, jumps %d, source %s \n",price, volume_remaining, type_id, range, order_id, volume_entered, minimum_volume, issued, bid, duration, station_id, region_id, solar_system_id, jumps, source); // and hash build follows below

تشغيله ينتج هذا:

I got 728499.93,437.0,2032,32767,1132932560,588,1,False,2009-05-24 19:52:08.000,90,60003760,10000002,30000142,0
I matched 7 values
I have price 728499.930000, vol_rem 437.000000, type_id 2032, range 32767, order_id 1132932560, vol_ent 588, min_vol 1, issued (null), bid (null), duration -1210229476, station_id 3001, region_id 3001, solar_system_id 1, jumps -1210299816

لاحظ الأوتار الخالية. في الأساس ، يبدو أن sscanf يعثر على هذه لسبب ما. لا يمكنني معرفة سبب قراءة المستندات تمامًا. أيه أفكار؟

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

المحلول

يتم توصيل مؤشرات شخصيتك ، وتشير إلى شريحة عشوائية من الذاكرة. يجب عليك تخصيص مخزن مؤقت لـ SSCANF () للكتابة إليه ، ويجب أن يكون كبيرًا بما يكفي. (أنت محظوظ لأنه لم يكن Segfault.) هذا الجزء الثاني هو الجزء الصعب - Scanf () قد لا يكون الأداة المناسبة للمهمة هنا.

نصائح أخرى

تخصيص الذاكرة على المكدس هو الطريقة البسيطة. مثال:

char issued[1024] = {0};
char bid[1024] = {0};

بالمناسبة ، "تخصيص الذاكرة على المكدس" يعني حقًا أخذ الموضع الحالي لمؤشر المكدس ، وتعيينه للاسم المتغير ثم زيادة مؤشر المكدس حسب حجم نوع المتغير. إنها عملية سريعة للغاية مقارنة بتخصيص الذاكرة على الكومة مع Malloc والأصدقاء. على عكس Malloc ، فإنك تفقد أي ذاكرة مخصصة للمكدس بمجرد أن تبرز إطار المكدس الحالي (أي تنفيذ يصل إلى نهاية الوظيفة الحالية).

%s يطابق الشخصيات غير المتسابقين. ما تريده هو %[^,]255 التي ستتطابق مع كل شخصية بخلاف , بدلاً من %s. 255 ، وهو اختياري ، يحدد عرض الحقل الذي تتوقعه لهذا الحقل.

وأنا أتفق مع ثناتوس. كبداية أولى ، تحتاج إلى تخصيص ذاكرة للإصدار والعطاء ، يمكنك القيام بذلك:

صدر تشار [1024] ؛ BID Char [1024] ؛

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top