سؤال

وأستخدمه fscanf لقراءة ملف التي لديها خطوط مثل
عدد <-whitespace-> سلسلة <-whitespace-> optional_3rd_column

وأود أن استخراج عدد وسلسلة من كل عمود، ولكن تجاهل 3rd_column إذا كان موجودا

مثال البيانات:
12 فو شيء
03 شريط
24 شيئا #randomcomment

وأريد أن استخراج 12، فو. 03 بار. 24، في حين تجاهل شيء "شيء ما" و "#randomcomment"

ولدي حاليا شيء من هذا القبيل

while(scanf("%d %s %*s",&num,&word)>=2)
{ 
assign stuff 
}

ولكن هذا لا يعمل مع خطوط مع عدم وجود عمود 3RD. كيف يمكنني جعله تجاهل كل شيء بعد سلسلة 2ND؟

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

المحلول

ويبدو لي أن أبسط الحلول هو scanf ( "٪ د٪ ق"، والأسطوانات، وكلمة) ثم fgets () لأكل ما تبقى من على خط المرمى.

نصائح أخرى

والمشكلة هي أن %*s يأكل الرقم على السطر التالي عندما لم يكن هناك العمود الثالث، ثم %d المقبل هو الفشل لأن رمز المقبل ليس عددا. لإصلاحه دون استخدام gets() تليها sscanf()، يمكنك استخدام فئة الحرف المحدد:

while(scanf("%d %s%*[^\n]", &num, &word) == 2)
{ 
    assign stuff 
}

وو[^\n] يقول لتتناسب مع العديد من الشخصيات ممكن ليست أسطر جديدة، و* يقمع المهمة كما كان من قبل. لاحظ أيضا أنه لا يمكنك وضع مسافة بين %s و%*[\n]، لأن خلاف ذلك سيكون هذا الفضاء في سلسلة التنسيق تطابق السطر الجديد، مما تسبب في %*[\n] لتتناسب مع خط لاحق بأكمله، وهي ليست على ما تريد.

استخدم fgets () لقراءة سطر في وقت واحد ثم استخدام sscanf () للبحث عن العمودين كنت مهتما، أكثر قوة، وكنت لا تملك ان تفعل شيئا خاصا لتجاهل زائدة البيانات.

وأنا غالبا ما تستخدم يحصل () تليها sscanf () على سلسلة أنت فقط، إيه، GOTS.

ومكافأة: يمكنك فصل اختبار لنهاية المدخلات من إعراب

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