Hướng dẫn c++ eof character - c ++ ký tự eof

Ký tự dòng mới được biểu thị bằng "\n" trong mã C. Có một đặc điểm tương đương cho nhân vật cuối tập tin (EOF) không?

Hỏi ngày 12 tháng 9 năm 2012 lúc 13:39Sep 12, 2012 at 13:39

Hướng dẫn c++ eof character - c ++ ký tự eof

static_rttistatic_rttistatic_rtti

52.2K45 Huy hiệu vàng131 Huy hiệu bạc187 Huy hiệu đồng45 gold badges131 silver badges187 bronze badges

4

EOF không phải là một nhân vật (trong hầu hết các hệ điều hành hiện đại). Nó chỉ đơn giản là một điều kiện áp dụng cho luồng tệp khi đạt được kết thúc của luồng. Sự nhầm lẫn phát sinh do người dùng có thể báo hiệu EOF cho đầu vào bảng điều khiển bằng cách nhập ký tự đặc biệt (ví dụ lần lượt tín hiệu EOF theo quy trình.

Lưu ý: Trong một số hệ điều hành rất cũ EOF là một nhân vật, ví dụ: Control-Z trong CP/M, nhưng đây là một hack thô để tránh chi phí duy trì độ dài tệp thực tế trong các thư mục hệ thống tệp.

Đã trả lời ngày 12 tháng 9 năm 2012 lúc 13:42Sep 12, 2012 at 13:42

8

EOF không phải là một nhân vật. Nó không thể là: một tệp (nhị phân) có thể chứa bất kỳ ký tự nào. Giả sử bạn có một tệp có byte ngày càng tăng, đi 0 1 2 3 ... 255 và một lần nữa 0 1 ... 255, với tổng số 512 byte. Bất cứ điều gì trong số 256 byte có thể mà bạn cho là EOF, tệp sẽ bị cắt ngắn.

Đó là lý do tại sao getchar() et al. trả lại một int. Phạm vi của các giá trị trả về có thể là các giá trị mà char có thể có, cộng với giá trị int chính hãng EOF (được xác định trong

#include 
int main(void)
{
    printf("%d", EOF);
    return 0;
}
2). Đó cũng là lý do tại sao việc chuyển đổi giá trị trả lại thành char trước khi kiểm tra EOF sẽ không hoạt động.

Lưu ý rằng một số giao thức có các ký tự "EOF" ". ASCII có "kết thúc văn bản", "kết thúc truyền", "kết thúc khối truyền" và "cuối trung bình". Các câu trả lời khác đã đề cập đến Old Os'es. Bản thân tôi nhập ^d trên Linux và ^z trên bảng điều khiển Windows để ngừng cung cấp các chương trình đầu vào. . Đó là lý do tại sao tất cả các chức năng dữ liệu không chuỗi C hoạt động bằng cách sử dụng mảng char (để chứa dữ liệu) và

#include 
int main(void)
{
    printf("%d", EOF);
    return 0;
}
8 (để biết nơi kết thúc dữ liệu).

Chỉnh sửa: Tiêu chuẩn C99 §7.19.1.3 Hoa Kỳ:

Các macro là [...] EOF mở rộng sang biểu thức hằng số nguyên, với loại int và giá trị âm, được trả về bởi một số hàm để chỉ ra kết thúc, nghĩa là không còn đầu vào từ luồng;
EOF
which expands to an integer constant expression, with type int and a negative value, that is returned by several functions to indicate end-of-file, that is, no more input from a stream;

Đã trả lời ngày 12 tháng 9 năm 2012 lúc 13:48Sep 12, 2012 at 13:48

Aibaibaib

44.1K10 Huy hiệu vàng71 Huy hiệu bạc78 Huy hiệu đồng10 gold badges71 silver badges78 bronze badges

7

Không. EOF không phải là một nhân vật, mà là một trạng thái của FileHandle.

Mặc dù có có các ký tự điều khiển trong ký tự ASCII đại diện cho phần cuối của dữ liệu, chúng không được sử dụng để báo hiệu phần cuối của các tệp nói chung. Ví dụ eot (^d) trong một số trường hợp gần như báo hiệu như nhau.

Khi thư viện C tiêu chuẩn sử dụng số nguyên đã ký để trả về các ký tự và sử dụng -1 cho cuối tệp, đây thực sự chỉ là tín hiệu để chỉ ra hơn là một lỗi đã xảy ra. Tôi không có sẵn tiêu chuẩn C, nhưng để trích dẫn Susv3:

Nếu chỉ báo cuối tệp cho luồng được đặt hoặc nếu luồng ở cuối tệp, chỉ báo cuối tệp cho luồng sẽ được đặt và fgetc () sẽ trả về EOF. Nếu xảy ra lỗi đọc, chỉ báo lỗi cho luồng sẽ được đặt, fgetc () sẽ trả về EOF và sẽ đặt errno để chỉ ra lỗi.

Đã trả lời ngày 12 tháng 9 năm 2012 lúc 13:43Sep 12, 2012 at 13:43

PMAKHOLMPMAKHOLMpmakholm

1.4888 Huy hiệu bạc23 Huy hiệu Đồng8 silver badges23 bronze badges

Tôi đã đọc tất cả các ý kiến. Thật thú vị khi nhận thấy những gì xảy ra khi bạn in ra điều này:

printf("\nInteger =    %d\n", EOF);             //OUTPUT = -1
printf("Decimal =    %d\n", EOF);               //OUTPUT = -1
printf("Octal =  %o\n", EOF);                   //OUTPUT = 37777777777
printf("Hexadecimal =  %x\n", EOF);             //OUTPUT = ffffffff
printf("Double and float =  %f\n", EOF);        //OUTPUT = 0.000000
printf("Long double =  %Lf\n", EOF);            //OUTPUT = 0.000000
printf("Character =  %c\n", EOF);               //OUTPUT = nothing

Như chúng ta có thể thấy ở đây, EOF không phải là một nhân vật (bất cứ điều gì).

Đã trả lời ngày 16 tháng 2 năm 2018 lúc 15:28Feb 16, 2018 at 15:28

Hướng dẫn c++ eof character - c ++ ký tự eof

carloswm85carloswm85carloswm85

9449 Huy hiệu bạc19 Huy hiệu đồng9 silver badges19 bronze badges

4

Ký tự EOF được nhận ra bởi trình thông dịch lệnh trên Windows (và MSDOS và CP/M) là 0x1a (Decimal 26, còn gọi là CTRL+Z AKA SUB)

Ví dụ, nó vẫn có thể được sử dụng để đánh dấu sự kết thúc của tiêu đề có thể đọc được trong tệp nhị phân: Nếu tệp bắt đầu bằng

#include 

int main()
{
char c;
int i = 0;
printf("INPUT:\t");
c = getchar();

while (c != EOF)
{
   ++i;
   c = getchar();
   
};

printf("NUMBER OF CHARACTERS %d.", i);

return 0;}
1, người dùng có thể đổ nội dung tệp vào bảng điều khiển bằng lệnh
#include 

int main()
{
char c;
int i = 0;
printf("INPUT:\t");
c = getchar();

while (c != EOF)
{
   ++i;
   c = getchar();
   
};

printf("NUMBER OF CHARACTERS %d.", i);

return 0;}
2 và kết xuất sẽ dừng tại Nhân vật EOF, tức là in một số mô tả và dừng lại, thay vì tiếp tục với rác sau đó.

Hướng dẫn c++ eof character - c ++ ký tự eof

Phuclv

34,9K12 Huy hiệu vàng143 Huy hiệu bạc439 Huy hiệu đồng12 gold badges143 silver badges439 bronze badges

Đã trả lời ngày 1 tháng 9 năm 2014 lúc 20:00Sep 1, 2014 at 20:00

Hướng dẫn c++ eof character - c ++ ký tự eof

Axel Rietschinaxel RietschinAxel Rietschin

5711 Huy hiệu vàng6 Huy hiệu bạc8 Huy hiệu đồng1 gold badge6 silver badges8 bronze badges

Đây là phụ thuộc hệ thống nhưng thường -1. Xem ở đây

Đã trả lời ngày 12 tháng 9 năm 2012 lúc 13:42Sep 12, 2012 at 13:42

EOF không phải là một nhân vật. Nó không thể là: một tệp (nhị phân) có thể chứa bất kỳ ký tự nào. Giả sử bạn có một tệp có byte ngày càng tăng, đi 0 1 2 3 ... 255 và một lần nữa 0 1 ... 255, với tổng số 512 byte. Bất cứ điều gì trong số 256 byte có thể mà bạn cho là EOF, tệp sẽ bị cắt ngắn.onoma

Đó là lý do tại sao getchar() et al. trả lại một int. Phạm vi của các giá trị trả về có thể là các giá trị mà char có thể có, cộng với giá trị int chính hãng EOF (được xác định trong

#include 
int main(void)
{
    printf("%d", EOF);
    return 0;
}
2). Đó cũng là lý do tại sao việc chuyển đổi giá trị trả lại thành char trước khi kiểm tra EOF sẽ không hoạt động.2 silver badges11 bronze badges

Lưu ý rằng một số giao thức có các ký tự "EOF" ". ASCII có "kết thúc văn bản", "kết thúc truyền", "kết thúc khối truyền" và "cuối trung bình". Các câu trả lời khác đã đề cập đến Old Os'es. Bản thân tôi nhập ^d trên Linux và ^z trên bảng điều khiển Windows để ngừng cung cấp các chương trình đầu vào. . Đó là lý do tại sao tất cả các chức năng dữ liệu không chuỗi C hoạt động bằng cách sử dụng mảng char (để chứa dữ liệu) và

#include 
int main(void)
{
    printf("%d", EOF);
    return 0;
}
8 (để biết nơi kết thúc dữ liệu).

#include 
int main(void)
{
    printf("%d", EOF);
    return 0;
}

Chỉnh sửa: Tiêu chuẩn C99 §7.19.1.3 Hoa Kỳ:

Đã trả lời ngày 12 tháng 9 năm 2012 lúc 13:43Sep 12, 2012 at 13:43

Keith Millerkeith MillerKeith Miller

1.3371 Huy hiệu vàng16 Huy hiệu bạc32 Huy hiệu đồng1 gold badge16 silver badges32 bronze badges

1

Giá trị của EOF không thể bị nhầm lẫn với bất kỳ nhân vật thực.

Nếu

#include 

int main()
{
char c;
int i = 0;
printf("INPUT:\t");
c = getchar();

while (c != EOF)
{
   ++i;
   c = getchar();
   
};

printf("NUMBER OF CHARACTERS %d.", i);

return 0;}
6, thì chúng ta phải khai báo
#include 

int main()
{
char c;
int i = 0;
printf("INPUT:\t");
c = getchar();

while (c != EOF)
{
   ++i;
   c = getchar();
   
};

printf("NUMBER OF CHARACTERS %d.", i);

return 0;}
7 đủ lớn để giữ bất kỳ giá trị nào mà getchar() trả về. Chúng ta không thể sử dụng char
#include 

int main()
{
char c;
int i = 0;
printf("INPUT:\t");
c = getchar();

while (c != EOF)
{
   ++i;
   c = getchar();
   
};

printf("NUMBER OF CHARACTERS %d.", i);

return 0;}
7 phải đủ lớn để giữ EOF ngoài các ký tự.

Luke Taylor

7.8078 Huy hiệu vàng53 Huy hiệu bạc87 Huy hiệu đồng8 gold badges53 silver badges87 bronze badges

Đã trả lời ngày 27 tháng 3 năm 2016 lúc 13:18Mar 27, 2016 at 13:18

1

Câu trả lời là không, nhưng ...

Bạn có thể bối rối vì hành vi của

#include 

int main()
{
char c;
int i = 0;
printf("INPUT:\t");
c = getchar();

while (c != EOF)
{
    if (c != '\n')
    {
        ++i;
    }

    c = getchar();
    };

printf("NUMBER OF CHARACTERS %d.", i);

return 0;}. 
1

Từ http://www.cplusplus.com/reference/cstdio/fgets/:

Đọc các ký tự từ luồng và lưu trữ chúng dưới dạng chuỗi C thành Str cho đến khi (Num-1) đã được đọc hoặc đạt được dòng mới hoặc phần cuối của tệp, tùy theo điều kiện nào xảy ra trước.either a newline or the end-of-file is reached, whichever happens first.

Đã trả lời ngày 23 tháng 2 năm 2017 lúc 10:50Feb 23, 2017 at 10:50

Betontalpfabetontalpfabetontalpfa

3,2141 Huy hiệu vàng32 Huy hiệu bạc57 Huy hiệu đồng1 gold badge32 silver badges57 bronze badges

Tôi đã nghiên cứu rất nhiều về tín hiệu EOF. Trong cuốn sách về lập trình trong C của Dennis Ritchie, lần đầu tiên gặp phải trong khi giới thiệu các lệnh Putchar () và getchar (). Về cơ bản, nó đánh dấu sự kết thúc của đầu vào chuỗi ký tự.

Ví dụ như ví dụ. Chúng ta hãy viết một chương trình tìm kiếm hai đầu vào số và in tổng của chúng. Bạn sẽ nhận thấy sau mỗi đầu vào số bạn nhấn Enter để đánh dấu tín hiệu rằng bạn đã hoàn thành hành động IPUT. Nhưng trong khi làm việc với các chuỗi ký tự Enter được đọc chỉ là một ký tự khác ['\ n': nhân vật Newline]. Để đánh dấu việc chấm dứt đầu vào, bạn nhập ^z (ctrl + z trên bàn phím) trong một dòng hoàn toàn mới và sau đó nhập. Điều đó báo hiệu các dòng lệnh tiếp theo để được thực thi.

#include 

int main()
{
char c;
int i = 0;
printf("INPUT:\t");
c = getchar();

while (c != EOF)
{
   ++i;
   c = getchar();
   
};

printf("NUMBER OF CHARACTERS %d.", i);

return 0;}

Trên đây là mã số để đếm số ký tự bao gồm '\ n' (newline) và '\ t' (không gian). Nếu bạn không muốn đếm các ký tự mới, hãy làm điều này:

#include 

int main()
{
char c;
int i = 0;
printf("INPUT:\t");
c = getchar();

while (c != EOF)
{
    if (c != '\n')
    {
        ++i;
    }

    c = getchar();
    };

printf("NUMBER OF CHARACTERS %d.", i);

return 0;}. 

Bây giờ suy nghĩ chính để đưa ra để đưa ra đầu vào. Thật đơn giản: Viết tất cả câu chuyện bạn muốn sau đó đi vào một dòng mới và nhập ^z và sau đó nhập lại.

Đã trả lời ngày 18 tháng 12 năm 2020 lúc 3:52Dec 18, 2020 at 3:52

Có hằng số EOF của loại int, được tìm thấy trong stdio.h. Không có ký tự tương đương theo nghĩa đen được chỉ định bởi bất kỳ tiêu chuẩn nào.

Đã trả lời ngày 12 tháng 9 năm 2012 lúc 13:42Sep 12, 2012 at 13:42

Hướng dẫn c++ eof character - c ++ ký tự eof

LundinlundinLundin

181K38 Huy hiệu vàng244 Huy hiệu bạc378 Huy hiệu đồng38 gold badges244 silver badges378 bronze badges