سؤال

وكيف أن نعرف أن fscanf صلت إلى خط \ ن جديد في الملف. لقد تم استخدام وظائف بلدي للقيام بذلك. أعرف أنني أستطيع أن استخدام fgets ثم sscanf لبلدي نمط المطلوبة. ولكن متطلبات بلدي ليست مستقرة، في بعض الأحيان أريد الحصول على TAB فصل السلاسل، في بعض الأحيان خط جديد فصل السلاسل وأحيانا بعض طابع خاص فصل السلاسل. حتى إذا كان هناك أي طريقة لمعرفة من خط جديد من fscanf الرجاء مساعدتي. وإلا أي وسائل بديلة هي أيضا موضع ترحيب.

يرجع الفضل في ذلك مسبقا.

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

المحلول

fscanf(stream, "%42[^\n]", buffer);

وهو equivalant من fgets (العازلة، 42، تيار). لا يمكنك استبدال 42 التي كتبها * لتحديد طول المخزن المؤقت في حجة (كما يمكنك القيام به في printf)، معناه لقمع المهمة. لذلك

fscanf(stream, "%*[^\n]%*c");

وقراءة تصل (ومدرجة) نهاية القادمة من حرف سطر.

وأي محدد تحويل بخلاف [، ج ون تبدأ من خلال تخطي الفراغات.

نصائح أخرى

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

.

وقال أن معظم عادة لا تستخدم الأسرة scanf() من الوظائف لملف I / O؛ أحصل على البيانات في سلسلة مع نوع من "الحصول على خط 'روتينية، ومن ثم استخدام الأسرة sscanf() وظائف لتقسيم عنه - أو غيرها من توزيع التعليمات البرمجية أكثر تخصصا

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