Come as guests, stay as family.

I ♥ 4MGHC


Hướng dẫn sử dụng diễn đàn Với mong muốn có một Website hỏi đáp chất lượng 4MGHC đã ra đời. Đây là cộng đồng hỏi đáp dành cho lập trình viên, sinh viên, các bạn ưu thích lập trình... Việt Nam. Huy vọng các bậc tiền bối, các bằng hữu gần xa chung tay chia sẽ, giúp đỡ, giải đáp các thắc mắc trên Website. Cùng nhau củng cố, đóng góp cho sự nghiệp phát triển thông tin, công nghệ của đất nước.
Trong diễn đàn bạn có thể
  1. Hỏi đáp trong diễn đàn
  2. Đánh giá và like bài post
Đăng ký

Số người đang xem trên diễn đàn: 1031
12
  1. Tân thế giới
    Posts:
    784319
    Vote:
    2
    Like:
    4
    Sử dụng hàm feof trong C như thế nào?
    Image
    Image
    Users online on this topic: 1
    kimthanh14
    Thành viên mới
    Ngày gia nhập: 04 2011
    Bài viết: 11
    -------------------------
    Sử dụng hàm feof trong C như thế nào?
    Em có thắc mắc về hàm feof(FILE *f). Em đã biết ý nghĩa của hàm là Kiểm tra xem đã chạm tới cuối tập tin hay chưa và trả về EOF nếu cuối tập tin được chạm tới, ngược lại trả về 0. Nhưng co một vấn đề chưa được rõ :
    Code:
    Code: Select all

    void coppyFile(FILE *fpsrc, FILE *fpcpy)
    {
    int n;
    while( !feof(fpsrc) )
    {
    fscanf(fpsrc,"%d",&n);
    fprintf(fpcpy,"%d",n);
    }
    }

    Nếu file nguồn : 5 6 4 thì file đích sẽ ghi : 5 6 4 4.

    Nhưng khi sửa đoạn code trên thành

    Code:
    Code: Select all

    void coppyFile(FILE *fpsrc, FILE *fpcpy)
    {
    int n;
    while( fscanf(fpsrc,"%d",&n) != EOF )
    fprintf(fpcpy,"%d",n);
    }

    Thì kết quả sẽ ra đúng là : 5 6 4.

    Mong mọi người hướng dẫn dùm em lí do của sự sai khác trên.
    Image 0
    Image
  2. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    dehin
    Thành viên nhiệt tình
    Ngày gia nhập: 09 2010
    Nơi ở: Hà Nôi
    Bài viết: 428
    -------------------------
    Bạn phải hiễu cặn kẽ như thế này

    Trả về : Hàm feof (FILE *file) trả về 0 nếu đã đọc đc kí tự kết thức file EOF, ngược lại trả về giá trị khác 0

    Cách làm việc của hàm feof(..) : nó sẽ kiểm tra xem trong lần đọc dữ liệu gần đây nhất, phần tử kết thúc file EOF có đc đọc ko. Nếu có hàm trả về giá trị khác 0( true), ngc lai trả về 0 (false)
    Image 0
    Image
    Image
  3. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    clamvn
    Thành viên nhiệt tình
    Ngày gia nhập: 11 2010
    Nơi ở: Black Hole
    Bài viết: 826
    -------------------------
    Trích dẫn:
    Nguyên bản được gửi bởi dehin
    Quote: Select all

    Bạn phải hiễu cặn kẽ như thế này

    Trả về : Hàm feof (FILE *file) trả về 0 nếu đã đọc đc kí tự kết thức file EOF, ngược lại trả về giá trị khác 0

    Cách làm việc của hàm feof(..) : nó sẽ kiểm tra xem trong lần đọc dữ liệu gần đây nhất, phần tử kết thúc file EOF có đc đọc ko. Nếu có hàm trả về giá trị khác 0( true), ngc lai trả về 0 (false)


    có sự nhầm nhọt gì ở đây ko ?

    feof() trả về 0 nếu ko phải là EOF , trả về 1 nếu là EOF chứ nhỉ
    __________________

    Come as guest...... stay as family......... because we're smiling together.
    Image 0
    Image
    Image
  4. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    dehin
    Thành viên nhiệt tình
    Ngày gia nhập: 09 2010
    Nơi ở: Hà Nôi
    Bài viết: 428
    -------------------------
    Trích dẫn:
    Nguyên bản được gửi bởi clamvn
    Quote: Select all

    có sự nhầm nhọt gì ở đây ko ?

    feof() trả về 0 nếu ko phải là EOF , trả về 1 nếu là EOF chứ nhỉ


    Chính xác đó.

    Hơn nữa bạn viết cho đúng cú pháp chút : "trả về 0 nếu ko phải là EOF" cái gì "ko phải là EOF"
    Các bạn phải lưu ý cách làm việc của hàm feof

    Khi con trỏ file đang ở vị trí EOF thì feof(...) vẫn trả về 0.

    Khi nào EOF đc đọc rồi thì feof(..) mơi trả về khác 0 (true)

    Hiểu cái này thì bạn sẽ giải thích đc vì sao đọc file như trên kí tự cuối bị lặp in ra tới 2 lần.
    Image 0
    Image
    Image
  5. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    clamvn
    Thành viên nhiệt tình
    Ngày gia nhập: 11 2010
    Nơi ở: Black Hole
    Bài viết: 826
    -------------------------
    Mình nói đúng giá trị cần test của feof(). Còn muốn hiểu kĩ thì tìm đọc thôi.

    Mình đâu phải là cá máy mà hỏi là trả lời chính xác 100%
    __________________

    Come as guest...... stay as family......... because we're smiling together.
    Image 0
    Image
    Image
  6. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    dehin
    Thành viên nhiệt tình
    Ngày gia nhập: 09 2010
    Nơi ở: Hà Nôi
    Bài viết: 428
    -------------------------
    Trích dẫn:
    Nguyên bản được gửi bởi clamvn
    Quote: Select all

    Mình nói đúng giá trị cần test của feof(). Còn muốn hiểu kĩ thì tìm đọc thôi.

    Mình đâu phải là cá máy mà hỏi là trả lời chính xác 100%


    Ko hiểu ah

    feof() trả về 0 nếu ko phải là EOF

    ko có chủ ngữ gì cả mình ko hiểu nên hỏi bạn nói cho chính xác cái gì " ko phải là EOF"

    Nhưng nói chung là bạn ko hiểu về hàm feof rồi.
    Image 0
    Image
    Image
  7. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    dohai2105
    Thành viên mới
    Ngày gia nhập: 10 2010
    Bài viết: 11
    -------------------------
    2 bác kia làm em rối măt quá , rốt cục là dư nào vậy
    Image 0
    Image
    Image
  8. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    blackmoon13
    Thành viên mới
    Ngày gia nhập: 11 2010
    Bài viết: 16
    -------------------------
    Trích dẫn:
    Nguyên bản được gửi bởi dehin
    Quote: Select all

    Chính xác đó.

    Hơn nữa bạn viết cho đúng cú pháp chút : "trả về 0 nếu ko phải là EOF" cái gì "ko phải là EOF"
    Các bạn phải lưu ý cách làm việc của hàm feof

    Khi con trỏ file đang ở vị trí EOF thì feof(...) vẫn trả về 0.

    Khi nào EOF đc đọc rồi thì feof(..) mơi trả về khác 0 (true)

    Hiểu cái này thì bạn sẽ giải thích đc vì sao đọc file như trên kí tự cuối bị lặp in ra tới 2 lần.


    Bạn có thể giải thích được ko?

    Mình nghĩ vấn đề không phải ở chỗ đó. Mình thử thay hàm fscanf và fprintf bằng 2 hàm đọc và ghi khác là fgetc và fputc thì chạy bình thường. Theo mình vấn đề là ở hàm fscanf kia kìa. Mình thử trước khi dùng fscanf thêm hàm fflush(file_nguồn) xem sao nhưng ko thành công. Vẫn chưa lý giải chính xác được! Để xem lại hàm này đã.
    Hic, post chậm 1 bài.
    __________________

    Trời đã sinh ra C sao còn sinh ra C++

    ------- Tôi yêu C/C++ ------------
    Image 0
    Image
    Image
  9. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    G.Perelman
    Thành viên nhiệt tình
    Ngày gia nhập: 04 2008
    Nơi ở: Bốn bề là nhà
    Bài viết: 705
    -------------------------
    Dehin giải thích rất đúng và tỉ mỉ đó. Khéo phải lập hẳn 1 topic.
    __________________

    Tổng đài tư vấn sức khỏe - tâm lý - HIV 19006246
    Image 0
    Image
    Image
  10. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    clamvn
    Thành viên nhiệt tình
    Ngày gia nhập: 11 2010
    Nơi ở: Black Hole
    Bài viết: 826
    -------------------------
    Trích dẫn:
    Nguyên bản được gửi bởi dehin
    Quote: Select all

    Bạn phải hiễu cặn kẽ như thế này

    Trả về : Hàm feof (FILE *file) trả về 0 nếu đã đọc đc kí tự kết thức file EOF, ngược lại trả về giá trị khác 0

    Cách làm việc của hàm feof(..) : nó sẽ kiểm tra xem trong lần đọc dữ liệu gần đây nhất, phần tử kết thúc file EOF có đc đọc ko. Nếu có hàm trả về giá trị khác 0( true), ngc lai trả về 0 (false)


    Mình ko có ý châm chít bnj nhưng câu nói trên của bạn là sai.

    Nó trả về 1 khi nó đọc dc giá trị EOF.
    __________________

    Come as guest...... stay as family......... because we're smiling together.
    Image 0
    Image
    Image
  11. Ký Túc Xá
    Posts:
    2533979
    Vote:
    19
    Like:
    2
    Image
    Image
    vitbau1412
    Thành viên nhiệt tình
    Ngày gia nhập: 03 2011
    Nơi ở: Bình Dương, Hồ Chí Minh
    Bài viết: 391
    -------------------------
    Trích dẫn:
    Nguyên bản được gửi bởi dehin

    Bạn phải hiễu cặn kẽ như thế này

    Trả về : Hàm feof (FILE *file) trả về 0 nếu đã đọc đc kí tự kết thức file EOF, ngược lại trả về giá trị khác 0

    Cách làm việc của hàm feof(..) : nó sẽ kiểm tra xem trong lần đọc dữ liệu gần đây nhất, phần tử kết thúc file EOF có đc đọc ko. Nếu có hàm trả về giá trị khác 0( true), ngc lai trả về 0 (false)
    Nếu nó đến cuối tệp thì trả về giá trị khác 0, còn ngược lại thì trả về 0

    Trích dẫn:
    Nguyên bản được gửi bởi clamvn
    Quote: Select all

    Nó trả về 1 khi nó đọc dc giá trị EOF.


    clamvn nói đúng rồi, nhưng mà không phải trả về 1 mà chính xác là trả về giá trị khác 0:

    http://www.cplusplus.com/reference/c...y/cstdio/feof/
    Image 0
    Image
    Image
12