Chào mọi người, mọi người giải đáp cho em khúc mắt chổ này. Giả sử em có file input.txt với nội dung là dãy các số thực: 1.2 1.3 1.4 1.5 1.6___ ( phía cuối có các khoảng trắng)
khi em đọc file bằng thư viện stdio.h và thư viện ifstream lần lượt như sau:
//thư viện stdio.h
void readFile(char* fileName){
FILE* fp = fopen(fileName,"rt");
if ( !fp ) {
cerr<<"error!!"; return;
}
float temp = 0;
while( !feof(fp)) {
fscanf(fp, "%f", &temp);
cout << temp << " ";
}
cout << endl;
fclose(fp);
}
khi đó chương trình sẽ xuất ra dãy số như trên nhưng số 1.6 được lặp lại 2 lần: 1.2 1.3 1.4 1.5 1.6 1.6
khi thêm vào đoạn code sau:
if (fscanf(fp, "%f", &temp) > 0)
cout << temp << " ";
else
break;
tức là chương trình trở thành:
void readFile2(char* fileName) {
FILE* fp = fopen(fileName, "rt");
if (!fp)
cerr << "khong the mo file!!" << endl;
float temp = 0;
while (!feof(fp)) {
if (fscanf(fp, "%f", &temp) > 0)
cout << temp << " ";
else
break;
}
cout << endl;
fclose(fp);
}
thì chương trình mới chạy đúng. Mình hiểu là vì cuối file có khoảng trắng nên nếu đọc bằng cách 1 thì đọc hết 1.6 rồi dòng !feof(fp) vẫn còn đúng nên vẫn tiếp tục đọc nhưng nếu vậy tại sao khi xuất ra biến temp vẫn có giá trị là 1.6 sau khi đã qua lệnh fscanf(fp, "%f", &temp);
Tương tự khi viết bằng ifstream thì 2 cách viết
while (!fp.eof()) {
fp >> temp;
cout<<temp<<" ";
}
và
while (!fp.eof()) {
if ( ! (fp >> temp) )
break;
cout << temp<<endl;
}
cũng cho ra kq tương tự. a LTD giải thích dùm em lý do được không ạ. tại sao biến temp lại chưa giá trị 1.6 2 lần mà k bị thay đổi giá trị.


83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?