سؤال

لدي الوظيفة التالية:

void writeResults(FILE* fp, FILE* fpw, Vector w, int size) {

 Vector x;

 while (1) {

       char line[MAX_DIMENSION];  //max dimension is 200

       if( (fgets(line,MAX_DIMENSION,fp)) == NULL) { //EOF
            return;
       }
       else {
           int i=0;
           while (line[i]!='\0') {
                printf("% d %c\n",i,line[i]); //print to check it
                i++;
           }
       }
 }
}

سطر الملف الذي يقرأه هو:

1,1
2,2

ومع ذلك ، عندما أقوم بطباعة كل شار حتى " 0" أحصل على هذا الإخراج:

 0 1  
 1 ,  
 2 1  
 3   
 4   
 0 2  
 1 ,  
 2 2  
 3   
 4   

هل لدى أي شخص أدنى فكرة عن سبب قراءة 3 و 4 chars الإضافية؟ (لا توجد مساحات إضافية في الملف).

ملاحظة: تم فتح الملف بالطريقة التالية:

FILE* fp = fopen(fileIn, "r");
if (fp == NULL) {
    perror("Couldn't open File");
    exit(errno);
}
هل كانت مفيدة؟

المحلول

عودة النقل ، تغذية الخط - على Windows؟

سيساعدنا إذا عرفنا كيف فتحت الملف. إذا فتحته كملف نصي ، فلا ينبغي لك رؤية الشخصين الإضافيين - فقط للخط الجديد. ومع ذلك ، إذا فتحته كملف ثنائي ، فيجب أن يقرأ بالفعل كل من CR و LF.

إذا كنت على Linux ، كما هو موضح في التعليقات ، فلدينا المزيد من أدوات التشخيص المتاحة. ربما أبسط البدء هو 'od -c file' سيظهر لك هذا بالضبط ما هو موجود في الملف. لاحظ أنه إذا كان الملف على مربع Windows ، فلا يزال من الممكن أن يكون له نهايات خط CRLF. إذا كنت تستخدم "Vim" ، فقد يخبرك أن نوع الملف هو [dos].

بدلاً من ذلك ، يمكنك طباعة الأحرف على أنها أعداد صحيحة (وكذلك الشخصيات):

printf("%d (%2d) %c\n", i, line[i], line[i]);

يجب أن تشاهد 49 لـ "1" ، 50 لـ "2" ، 44 لـ "، 10 لخط جديد (LF ،"\n') ، وشيء آخر أيضًا - هذا هو الغموض (لكنه سيظهر 13 لـ CR).


CR هو \r شخصية في مصدر C. تم استخدامه للإشارة إلى أن رأس الطباعة يجب أن يعود إلى بداية الخط (تم إرجاع عربة الطابعة إلى بدء الخط) ؛ قامت LF أو Line Feed بتمرير الورق لأعلى خط. يستخدم كل من Windows و MS-DOS تسلسل CRLF (CURR-LIFF) للإشارة إلى نهاية الخط ؛ تستخدم Unix دائمًا فقط LF ، AKA NewLine أو NL ؛ MacOS 9 والاستخدام في وقت سابق فقط Cr.

نصائح أخرى

لا تطبع ٪ C ، Print ٪ D وسترى أحرف ASCII رمز. ستجد الشخصيات هي عودة النقل وتغذية الخط. 13 و 10

تشير إلى http://www.asciitable.com/

أعتقد أن ملف الإدخال الخاص بك يحتوي على-

1,1
[SPACESPACE]
2,2
[SPACESPACE]

لذلك أول مرة اقرأ مثل-

line{'1',',','1','',''}

والمرة الثانية تقرأ

line{'2',',','2','',''}

لهذا السبب ، تحصل على الإخراج كما حددت

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