سؤال

هو استخدام. fseek إلى تراجع شخصية fscanf العمليات موثوق بها؟

مثل على سبيل المثال إذا كان لدي فقط fscanf- 10 أحرف ولكن أود أن تراجعت السحر 10 هل يمكنني فقط fseek(infile, -10, SEEK_CUR) ?

بالنسبة لمعظم المواقف التي تعمل، يبدو أن لدي مشاكل في الشخصية ^M. وبعد فيما يبدو fseek يسجلها كحرار ولكن fscanf لا يسجله، وبالتالي في مثلي السابق كتلة 10 تشار تحتوي على ^M قد يحتاج fseek(infile, -11, SEEK_CUR) في حين أن. fseek(infile, -10, SEEK_CUR) سيجعل جلبها بحرف 1.

لماذا هو كذلك؟

تحرير: كنت أستخدم fopen في وضع النص

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

المحلول

كنت ترى الفرق بين "النص" وملف "ثنائي". عند فتح ملف في وضع النص (لا "B" في وسيطة FOPEN الثانية)، قد يفسر مكتبة Stdio (في الواقع) محتويات الملف وفقا لاتفاقيات نظام التشغيل لملفات نصية. على سبيل المثال، في Windows، ينتهي خط مع r n، وترجم هذا إلى n واحد بواسطة stdio، لأن هذه هي اتفاقية C. عند الكتابة إلى ملف نصي، يتم إخراج واحد n r n.

هذا يجعل من السهل كتابة برامج C المحمولة التي تعالج الملفات النصية. بعض التفاصيل تصبح معقدة، ومع ذلك، فإن fseeking هو واحد منهم. لهذا السبب من ذلك، يحدد C القياسية C فقط FSEEK في الملفات النصية في حالات قليلة: إلى البداية، إلى النهاية، إلى الوضع الحالي، وإلى موقع سابق تم استرجاعه مع FTELL. بمعنى آخر، لا يمكنك حساب موقع للحصول على ملفات نصية. أو يمكنك، ولكن عليك أن تهتم بكل التفاصيل الخاصة بالمنصة بنفسك.

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

في قضيتك، إذا كنت ترغب فقط في العودة إلى المكان الذي تقدم فيه FSCANCF، فإن الأسهل سيكون استخدام FTELL قبل FSCANF.

نصائح أخرى

وذلك لأن FSEEK يعمل مع البايتات، في حين أن FSCANF مقابض بذكاء أن عودة النقل وتغذية الخط هي بايتان، وتبعدها كجنوت واحد.

ليس لدى FSEEK فهما لمحتويات الملف ويتحرر فقط أحرف FilePointer 10 مرة أخرى.

FSCANF اعتمادا على نظام التشغيل، قد يفسر خطوط نيو هناك؛ قد يكون حتى أنه سيتم إدراج FSCAMANF ^ m إذا كنت على DOS و ^ m لا يظهر في الملف. تحقق دليلك الذي جاء مع مترجم C الخاص بك

حاول فقط هذا مع VS2008 ووجد أن FSCANF و FSEEK يعامل أحرف CR و LF بنفس الطريقة (كحرف مفرد).

لذلك مع اثنين من الملفات:

0000000: 3132 3334 3354 3738 3930 3132 3334 3536 12345X7890123456

و

0000000: 3132 3334 350D 0A37 3839 3031 3233 3435 12345..789012345

إذا قرأت 15 حرفا، فأنا أصل إلى الثاني "5"، ثم قم بتسجيل 10 أحرف، وقراءة أحرفي التالية هي "X" في الحالة الأولى و CRLF في الثانية.

هذا يبدو وكأنه مشكلة محددة OS / مترجم للغاية.

هل قمت باختبار قيمة العودة لل fscanfب نشر بعض الكود.

إلقاء نظرة على ungetc. وبعد قد تضطر إلى تشغيل حلقة فوقها.

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