سؤال
وأستخدمه 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.
ومكافأة: يمكنك فصل اختبار لنهاية المدخلات من إعراب