那麼,如果你做了一個fgets
,你將只能得到一個EOF文件指針已經在文件末尾。並且在您測試返回值的唯一fgetc
之前的說明是fseek(inz, -23, SEEK_CUR);
。
這意味着當您到達文件結尾時,首先返回23個字節,成功讀取某些內容,並且可能會在忽略返回值的以下兩個fgets
中的任何一個上獲得EOF。並永遠重複...
你應該怎麼做?至少測試每一個返回值讀取功能:
if (fgets(Name1, 24, inz) == NULL) break;
if (fgets(Name2, 24, inz) == NULL) break;
但它不是全部。除非你是真的確定你的所有行總是隻有23個字符,並且文件以二進制模式打開(或者你在Linux上),所以從不使用這種fseek
。唯一合理的方法是將位置ftell
然後fseek
存儲到該位置。
最後但並非最不重要的一點,你的algorythm回去一行,在Name1中讀取你剛剛在Name2中讀到的內容。而應該換P1和P2,總是讀入P2和比較P1和P2
這其中將整理文件無論是線尺寸提供他們都比尺寸比4短,但長:
size_t oldpos = 0, tmp;
char Name1[SIZE], Name2[SIZE],*p1,*p2;
p1 = Name1;
p2 = Name2;
/* read first line and note position after it */
if (fgets(p1, SIZE, inz) == NULL) return;
tmp = ftell(inz);
/* loop reading in p2 */
while (fgets(p2, SIZE, inz) != NULL){
if (atoi(p1 + 3) > atoi(p2 + 3)){
/* swap last two lines */
fseek(inz, oldpos, SEEK_SET);
fputs(p2, inz);
fputs(p1, inz);
/* and go back to beginning of file - not optimal but robust */
fseek(inz, 0, SEEK_SET);
/* again last line in p1 and note position */
fgets(p1, SIZE, inz);
oldpos = 0;
tmp = ftell(inz);
}
else {
/* order is ok untill here, note new position and swap buffers */
oldpos = tmp;
tmp = ftell(inz);
swap(&p1, &p2);
}
}
「我」在哪裏定義以及它在做什麼?我認爲你永遠不會到達EOF,因爲你反覆調用fseek來倒帶文件。我建議開始在另一個文件中編寫有序列表。 –
在循環的每次迭代中,在讀入('ch','Name1','Name2','p1'和'p2')後打印出所有變量。此外,打印'ftell()'的結果,以便您可以看到文件中的位置。這應該能讓你明白你的邏輯錯誤。 – dbush
請在文件樣本的預期變更後提交文件。 – BLUEPIXY