- 1 1. ã¯ããã«
- 2 2. readé¢æ°ã®åºæ¬
- 3 3. readé¢æ°ã®äœ¿çšäŸ
- 4 4. readé¢æ°ã®å¿çš
- 5 5. readé¢æ°äœ¿çšæã®æ³šæç¹
- 6 6. ãããã質åïŒFAQïŒ
- 6.1 Q1. readé¢æ°ãšfreadé¢æ°ã®éãã¯ïŒ
- 6.2 Q2. readé¢æ°ã0ãè¿ãå Žåãããã¯ãšã©ãŒã§ããïŒ
- 6.3 Q3. éããããã³ã°ã¢ãŒãã§readé¢æ°ã䜿çšããæ¹æ³ã¯ïŒ
- 6.4 Q4. readé¢æ°ã-1ãè¿ããå Žåãã©ãããã°ããã§ããïŒ
- 6.5 Q5. ãã¡ã€ã«ãµã€ãºã倧ããããå Žåãã©ãåŠçããã°ããã§ããïŒ
- 6.6 Q6. readé¢æ°ã§ããŒã¿ãéäžã§éåããã®ã¯ãªãã§ããïŒ
- 6.7 FAQãŸãšã
- 7 7. ãŸãšã
1. ã¯ããã«
Cèšèªã®read
é¢æ°ã¯ãã·ã¹ãã ããã°ã©ãã³ã°ã«ãããåºæ¬äžã®åºæ¬ãšãããæ©èœã§ãããã¡ã€ã«ãããã€ã¹ããããŒã¿ãçŽæ¥èªã¿èŸŒãããã®äœã¬ãã«å
¥åºåé¢æ°ã§ãããä»ã®å
¥åºåé¢æ°ãšæ¯ã¹ãŠã·ã¹ãã ã®æåã詳现ã«å¶åŸ¡ã§ããã®ãç¹åŸŽã§ãã
ãã®èšäºã§ã¯ãread
é¢æ°ã®åºæ¬çãªäœ¿ãæ¹ããå¿çšãããããçåç¹ã®è§£æ±ºãŸã§å¹
åºã解説ããŸããç¹ã«ãåå¿è
ãã€ãŸããããããã€ã³ããå®çšçãªã³ãŒãäŸãäžå¿ã«èª¬æããäžçŽè
åãã«ã¯éåæI/Oããšã©ãŒåŠçã®æ·±æããè¡ããŸãããã®èšäºãèªã¿çµããããšã§ãread
é¢æ°ãå¹æçãã€å®å
šã«äœ¿ãããªãããã®ç¥èã身ã«ã€ãã§ãããã
Cèšèªã®read
é¢æ°ãšã¯ïŒ
read
é¢æ°ã¯ãPOSIXæšæºã§å®çŸ©ãããã·ã¹ãã ã³ãŒã«ã®1ã€ã§ãLinuxãUNIXç³»OSã§åºãå©çšãããŠããŸãããã®é¢æ°ã¯ããã¡ã€ã«ãã£ã¹ã¯ãªãã¿ãéããŠããŒã¿ãèªã¿èŸŒã¿ãŸããããšãã°ããã¡ã€ã«ãæšæºå
¥åããœã±ãããªã©ãããŸããŸãªããŒã¿ãœãŒã¹ããã®èªã¿åãããµããŒãããŸãã
read
é¢æ°ã¯ãäœã¬ãã«ã®æäœãå¯èœã§ããäžæ¹ã§ãåå¿è
ã«ãšã£ãŠã¯æ±ããé£ããéšåããããŸããç¹ã«ããããã¡ç®¡çããšã©ãŒåŠçã«ã€ããŠã®ç解ãæ¬ ãããŸãããä»ã®é«ã¬ãã«é¢æ°ïŒäŸ: fread
, scanf
ïŒãšæ¯ã¹ãŠãread
é¢æ°ã¯OSã«çŽæ¥äŸåããæåãæã€ãããããæè»ãªå¶åŸ¡ãå¯èœã§ããããã®åæ
éãªå®è£
ãæ±ããããŸãã
ä»ã®å ¥åºåé¢æ°ãšã®éã
Cèšèªã«ã¯ãread
é¢æ°ä»¥å€ã«ãå
¥åºåãæ±ãããã®é¢æ°ãããã€ãååšããŸããããããã®ç¹åŸŽãç°¡åã«æ¯èŒããŠã¿ãŸãããã
é¢æ°å | ã¬ãã« | äž»ãªçšé | ç¹åŸŽ |
---|---|---|---|
read | äœã¬ãã« | ãã¡ã€ã«ãããã€ã¹ããã®èªã¿åã | ã·ã¹ãã ã³ãŒã«ãæè»æ§ãé«ã |
fread | é«ã¬ãã« | ãã¡ã€ã«ã¹ããªãŒã ã®èªã¿åã | æšæºCã©ã€ãã©ãªãæ±ãããã |
scanf | é«ã¬ãã« | æšæºå ¥åã®èªã¿åã | ãã©ãŒãããæå®ãå¯èœ |
read
é¢æ°ã¯ãäœã¬ãã«æäœãå¿
èŠãšããå Žé¢ïŒäŸ: ããã€ã¹éä¿¡ã倧容éãã¡ã€ã«åŠçïŒã§ç¹ã«æçšã§ããäžæ¹ãfread
ãscanf
ã¯ãæ軜ãã簡䟿ããæ±ããããå Žé¢ã«åããŠããŸãã
èšäºã§æ±ãå 容
ãã®èšäºã§ã¯ã以äžã®ãããã¯ã«ã€ããŠè©³ãã解説ããŸãã
- åºæ¬çãªäœ¿ãæ¹
read
é¢æ°ã®ãããã¿ã€ããåŒæ°ãæ»ãå€ã®æå³ãåŠã³ãŸãã - å
·äœçãªäœ¿çšäŸ
ãã¡ã€ã«èªã¿èŸŒã¿ãæšæºå ¥åããœã±ããéä¿¡ãªã©ã®å®çšäŸã瀺ããŸãã - å¿çšäŸãšãã©ãã«ã·ã¥ãŒãã£ã³ã°
éåæI/Oã®èšå®æ¹æ³ããšã©ãŒåŠçã®ãã¹ããã©ã¯ãã£ã¹ã解説ããŸãã - ãããã質åãšè§£æ±ºç
èªè ãæ±ããããçåãFAQ圢åŒã§ã«ããŒããŸãã
åå¿è ããäžçŽè ãŸã§ãå¹ åºãèªè ã«å¯Ÿå¿ããå 容ãç®æããŠããŸãã
2. read
é¢æ°ã®åºæ¬
Cèšèªã®read
é¢æ°ã¯ããã¡ã€ã«ãããã€ã¹ããããŒã¿ãèªã¿åãããã®äœã¬ãã«I/Oé¢æ°ã§ãããã®ã»ã¯ã·ã§ã³ã§ã¯ãread
é¢æ°ã®åºæ¬çãªä»æ§ã«ã€ããŠãå
·äœçãªã³ãŒãäŸã亀ããŠè§£èª¬ããŸãã
read
é¢æ°ã®ãããã¿ã€ã
read
é¢æ°ã®ãããã¿ã€ãã¯ä»¥äžã®éãã§ãïŒ
ssize_t read(int fd, void *buf, size_t count);
åŒæ°ã®èª¬æ
fd
ïŒãã¡ã€ã«ãã£ã¹ã¯ãªãã¿ïŒ
- èªã¿åã察象ãæå®ããŸãã
- ããšãã°ã
open
é¢æ°ã§ååŸãããã¡ã€ã«ãã£ã¹ã¯ãªãã¿ããæšæºå ¥åïŒ0
ïŒãæšæºåºåïŒ1
ïŒãªã©ãæå®ããŸãã
buf
ïŒãããã¡ïŒ
- ããŒã¿ãäžæçã«æ ŒçŽããã¡ã¢ãªé åã®ã¢ãã¬ã¹ãæž¡ããŸãã
- ãã®é åã¯ãèªã¿åã£ãããŒã¿ãä¿æããããããããããååãªãµã€ãºã確ä¿ããå¿ èŠããããŸãã
count
ïŒãã€ãæ°ïŒ
- èªã¿åãæ倧ãã€ãæ°ãæå®ããŸãã
- ãããã¡ãµã€ãºä»¥äžã§ããããšãæšå¥šãããŸãã
æ»ãå€
- æ£åžžæ: èªã¿èŸŒãã ãã€ãæ°ãè¿ããŸãïŒ0ã¯EOFã瀺ãïŒã
- ç°åžžæ:
-1
ãè¿ãããšã©ãŒå 容ãerrno
ã§ç¢ºèªããŸãã
åºæ¬çãªäœ¿çšäŸ
以äžã¯ããã¡ã€ã«ããããŒã¿ãèªã¿èŸŒãåºæ¬çãªäŸã§ãã
ã³ãŒãäŸ
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Failed to open file");
return 1;
}
char buffer[128];
ssize_t bytesRead;
while ((bytesRead = read(fd, buffer, sizeof(buffer) - 1)) > 0) {
buffer[bytesRead] = ' '; // èªã¿åã£ãããŒã¿ãæååãšããŠæ±ãããã«çµç«¯ãèšå®
printf("%s", buffer); // èªã¿åã£ãããŒã¿ãåºå
}
if (bytesRead == -1) {
perror("Failed to read file");
}
close(fd);
return 0;
}
ã³ãŒã解説
open
é¢æ°ã§ãã¡ã€ã«ãéã
O_RDONLY
ãæå®ããŠèªã¿åãå°çšã¢ãŒãã§ãã¡ã€ã«ãéããŸãã- ãã¡ã€ã«ãéããªãå Žåããšã©ãŒãåºåããŸãã
read
é¢æ°ã§ããŒã¿ãèªã¿èŸŒã
- ãã¡ã€ã«ãã
buffer
ã«æ倧128ãã€ããèªã¿èŸŒã¿ãŸãã - èªã¿èŸŒã¿ãæåããå Žåãå®éã«èªã¿åã£ããã€ãæ°ãè¿ãããŸãã
- ãšã©ãŒåŠç
- ãã¡ã€ã«ãååšããªãããŸãã¯èªã¿åãæš©éããªãå Žåã«
-1
ãè¿ããŸãã
- ãããã¡ã®çµç«¯ãèšå®
- èªã¿åã£ãããŒã¿ãæååãšããŠåºåããããã«ãæåŸã«
' '
ãè¿œå ããŸãã
read
é¢æ°ã䜿çšããéã®æ³šæç¹
ãããã¡ãµã€ãºãšå®å šæ§
- ãããã¡ãµã€ãºãè¶
ããããŒã¿ãèªã¿èŸŒãããšãããšãã¡ã¢ãªç Žå£ãçºçããå¯èœæ§ããããŸãã
count
ã«ã¯ãããã¡ãµã€ãºä»¥äžã®å€ãæå®ããŠãã ããã
EOFïŒãã¡ã€ã«çµç«¯ïŒã®æ±ã
read
é¢æ°ã0
ãè¿ãå Žåãããã¯EOFïŒEnd of FileïŒã®æå³ã§ãããã®å Žåãããã«ããŒã¿ãèªã¿åãè©Šã¿ãè¡ãå¿ èŠã¯ãããŸããã
éšåçãªèªã¿åã
read
é¢æ°ã¯æå®ãããã€ãæ°ãã¹ãŠãå¿ ãããäžåºŠã«èªã¿åããšã¯éããŸãããç¹ã«ããããã¯ãŒã¯ãœã±ããããã€ãã§ã¯ãããŒã¿ããŸã å°çããŠããªãå ŽåããããŸãããã®å Žåãã«ãŒãã§read
ãåŒã³åºããŠããŒã¿ãå®å šã«èªã¿åãå¿ èŠããããŸãã
3. read
é¢æ°ã®äœ¿çšäŸ
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãread
é¢æ°ãå®éã«äœ¿çšããäŸãããã€ãåãäžããŸããåºæ¬çãªãã¡ã€ã«èªã¿èŸŒã¿ãããæšæºå
¥åãããã«ã¯ãããã¯ãŒã¯ãœã±ããéä¿¡ã«ãããå¿çšäŸãŸã§å¹
åºã解説ããŸãã
åºæ¬çãªãã¡ã€ã«èªã¿èŸŒã¿
ãŸãã¯ããã¡ã€ã«ããããŒã¿ãèªã¿èŸŒãåºæ¬çãªäœ¿ãæ¹ã玹ä»ããŸããread
é¢æ°ã¯ãããã¹ããã¡ã€ã«ããã€ããªãã¡ã€ã«ã®èªã¿åãã«ã䜿çšã§ããŸãã
ã³ãŒãäŸïŒããã¹ããã¡ã€ã«ã®èªã¿èŸŒã¿
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Failed to open file");
return 1;
}
char buffer[128];
ssize_t bytesRead;
while ((bytesRead = read(fd, buffer, sizeof(buffer) - 1)) > 0) {
buffer[bytesRead] = ' '; // èªã¿åã£ãããŒã¿ãæååãšããŠæ±ãããã«çµç«¯ãèšå®
printf("%s", buffer); // èªã¿åã£ãããŒã¿ãåºå
}
if (bytesRead == -1) {
perror("Failed to read file");
}
close(fd);
return 0;
}
ã³ãŒã解説
- ãã¡ã€ã«ãéã
open
é¢æ°ã䜿çšããŠãã¡ã€ã«ãèªã¿åãå°çšã§éããŸãã倱æããå Žåã¯ãšã©ãŒãåºåããŸãã
read
é¢æ°ã§ã«ãŒãåŠç
- ãã¡ã€ã«ã®çµç«¯ïŒEOFïŒã«å°éãããŸã§ããããã¡ã«ããŒã¿ãç¹°ãè¿ãèªã¿èŸŒã¿ãŸãã
- ãšã©ãŒãã³ããªã³ã°
read
é¢æ°ã-1
ãè¿ããå Žåã¯ãšã©ãŒãçºçããŠãããããperror
ã§åå ã衚瀺ããŸãã
- ãã¡ã€ã«ãéãã
- æåŸã«
close
é¢æ°ã§ãã¡ã€ã«ãã£ã¹ã¯ãªãã¿ãéããŠãªãœãŒã¹ã解æŸããŸãã
æšæºå ¥åããã®ããŒã¿ååŸ
次ã«ãæšæºå ¥åïŒããŒããŒãå ¥åïŒããããŒã¿ãååŸããäŸã瀺ããŸããããã¯ãç°¡åãªCLIããŒã«ã察話åããã°ã©ã ã§ãã䜿ãããæ¹æ³ã§ãã
ã³ãŒãäŸïŒãŠãŒã¶ãŒå ¥åã®ååŸ
#include <unistd.h>
#include <stdio.h>
int main() {
char buffer[64];
printf("Enter some text: ");
ssize_t bytesRead = read(0, buffer, sizeof(buffer) - 1); // æšæºå
¥åãæå®ïŒ0ã¯stdinïŒ
if (bytesRead == -1) {
perror("Failed to read input");
return 1;
}
buffer[bytesRead] = ' '; // Nullçµç«¯æåãè¿œå
printf("You entered: %s
", buffer);
return 0;
}
ã³ãŒã解説
- æšæºå ¥åãæå®
read
é¢æ°ã®ç¬¬äžåŒæ°ã«0
ãæå®ããæšæºå ¥åïŒããŒããŒãå ¥åïŒããããŒã¿ãèªã¿åããŸãã
- ãããã¡ã®çµç«¯èšå®
- èªã¿åã£ãããŒã¿ãæååãšããŠæ±ãããããçµç«¯ã«
' '
ãè¿œå ããŸãã
- ãšã©ãŒãã³ããªã³ã°
- å
¥åã®èªã¿åãã«å€±æããå Žåã
perror
ã䜿çšããŠãšã©ãŒå 容ã衚瀺ããŸãã
ãœã±ããéä¿¡ã§ã®ããŒã¿åä¿¡
read
é¢æ°ã¯ããããã¯ãŒã¯ããã°ã©ãã³ã°ã«ãããŠãå©çšãããŸããããã§ã¯ãç°¡åãªãµãŒããŒããã°ã©ã ãäŸã«ããœã±ããããã®ããŒã¿åä¿¡æ¹æ³ã説æããŸãã
ã³ãŒãäŸïŒãœã±ããããã®ããŒã¿åä¿¡
以äžã¯ãã¯ã©ã€ã¢ã³ãããã®ã¡ãã»ãŒãžãåä¿¡ããŠè¡šç€ºãããµãŒããŒããã°ã©ã ã®äŸã§ãã
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main() {
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == -1) {
perror("Socket creation failed");
return 1;
}
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) == -1) {
perror("Bind failed");
close(server_fd);
return 1;
}
if (listen(server_fd, 3) == -1) {
perror("Listen failed");
close(server_fd);
return 1;
}
int client_fd = accept(server_fd, NULL, NULL);
if (client_fd == -1) {
perror("Accept failed");
close(server_fd);
return 1;
}
char buffer[1024];
ssize_t bytesRead = read(client_fd, buffer, sizeof(buffer) - 1);
if (bytesRead > 0) {
buffer[bytesRead] = ' ';
printf("Message received: %s
", buffer);
} else if (bytesRead == -1) {
perror("Read failed");
}
close(client_fd);
close(server_fd);
return 0;
}
ã³ãŒã解説
- ãœã±ããã®äœæ
socket
é¢æ°ã䜿çšããŠãTCPãœã±ãããäœæããŸãã
- ã¢ãã¬ã¹ã®ãã€ã³ã
- ãµãŒããŒã®IPã¢ãã¬ã¹ãšããŒããæå®ããŠããœã±ããããã€ã³ãããŸãã
- æ¥ç¶åŸ ã¡
listen
é¢æ°ã䜿çšããŠã¯ã©ã€ã¢ã³ãããã®æ¥ç¶ãåŸ æ©ããŸãã
- ã¯ã©ã€ã¢ã³ãæ¥ç¶ã®åãå ¥ã
accept
é¢æ°ã§æ¥ç¶ãåãå ¥ããæ°ãããã¡ã€ã«ãã£ã¹ã¯ãªãã¿ïŒclient_fd
ïŒãååŸããŸãã
- ããŒã¿ã®èªã¿åã
- ã¯ã©ã€ã¢ã³ãããéä¿¡ãããããŒã¿ã
read
é¢æ°ã§èªã¿åãããããã¡ã«æ ŒçŽããŸãã
䜿çšäŸãŸãšã
ãããã®äŸã¯ãread
é¢æ°ãåãªããã¡ã€ã«æäœã«ãšã©ãŸãããããŸããŸãªå Žé¢ã§å¿çšå¯èœã§ããããšã瀺ããŠããŸããç¹ã«ããœã±ããéä¿¡ã§ã¯ãread
é¢æ°ãããŒã¿åä¿¡ã®éèŠãªåœ¹å²ãæãããŸãã
4. read
é¢æ°ã®å¿çš
read
é¢æ°ã¯ãåºæ¬çãªãã¡ã€ã«æäœã ãã§ãªããé«åºŠãªããã°ã©ãã³ã°ã«ãå¿çšã§ããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ãéåæI/Oã倧éããŒã¿ã®å¹ççãªåŠçããã€ããªããŒã¿ã®èªã¿åããšãã£ãå¿çšäŸã«ã€ããŠè§£èª¬ããŸãã
éåæI/Oã§ã®å©çš
éåæI/Oã䜿çšãããšãread
é¢æ°ãããŒã¿ãåŸ
æ©ããŠããéã«ä»ã®ã¿ã¹ã¯ãå®è¡ã§ããããã«ãªããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžããŸãã
éåæã¢ãŒãã®èšå®
éåæã¢ãŒããæå¹ã«ããã«ã¯ãfcntl
é¢æ°ã䜿çšããŠãã¡ã€ã«ãã£ã¹ã¯ãªãã¿ãéããããã³ã°ã¢ãŒãã«èšå®ããŸãã
ã³ãŒãäŸïŒéåæI/Oã®èšå®
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
int main() {
int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Failed to open file");
return 1;
}
// éããããã³ã°ã¢ãŒããèšå®
int flags = fcntl(fd, F_GETFL, 0);
if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
perror("Failed to set non-blocking mode");
close(fd);
return 1;
}
char buffer[128];
ssize_t bytesRead;
while ((bytesRead = read(fd, buffer, sizeof(buffer) - 1)) != 0) {
if (bytesRead > 0) {
buffer[bytesRead] = ' ';
printf("Data read: %s
", buffer);
} else if (bytesRead == -1 && errno == EAGAIN) {
printf("No data available, try again later
");
} else if (bytesRead == -1) {
perror("Read error");
break;
}
}
close(fd);
return 0;
}
ã³ãŒã解説
- éããããã³ã°ã¢ãŒãã®èšå®
fcntl
é¢æ°ã§ãã¡ã€ã«ãã£ã¹ã¯ãªãã¿ã«O_NONBLOCK
ãã©ã°ãèšå®ããŸãã
- ãšã©ãŒåŠç
- ããŒã¿ããŸã å©çšã§ããªãå Žåã
errno
ãEAGAIN
ãŸãã¯EWOULDBLOCK
ã«èšå®ãããŸãã
- ã«ãŒãã§ã®èªã¿åã
- éåæI/Oã§ã¯ãå¿
èŠã«å¿ããŠç¹°ãè¿ã
read
ãåŒã³åºãèšèšãéèŠã§ãã
倧éããŒã¿ãå¹ççã«èªã¿èŸŒãæ¹æ³
倧éã®ããŒã¿ãåŠçããéãå¹ççãªã¡ã¢ãªç®¡çãšãããã¡èšå®ãéèŠã§ãã以äžã§ã¯ãå¹ççãªããŒã¿èªã¿èŸŒã¿ãå®çŸãããã¯ããã¯ã解説ããŸãã
ãã¯ããã¯1: ãããã¡ãµã€ãºã®æé©å
- ãããã¡ãµã€ãºã倧ãããããšãã·ã¹ãã ã³ãŒã«ã®åæ°ãæžãããæ§èœãåäžããŸãã
- äžè¬çã«ã¯ãã·ã¹ãã ã®ããŒãžãµã€ãºïŒ
getpagesize()
ã§ååŸå¯èœïŒã«åãããã®ãè¯ããšãããŠããŸãã
ã³ãŒãäŸ: 倧ããªãããã¡ã䜿çš
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
int fd = open("largefile.bin", O_RDONLY);
if (fd == -1) {
perror("Failed to open file");
return 1;
}
size_t bufferSize = 4096; // 4KB
char *buffer = malloc(bufferSize);
if (!buffer) {
perror("Failed to allocate buffer");
close(fd);
return 1;
}
ssize_t bytesRead;
while ((bytesRead = read(fd, buffer, bufferSize)) > 0) {
printf("Read %zd bytes
", bytesRead);
// å¿
èŠã«å¿ããŠåŠçãè¿œå
}
if (bytesRead == -1) {
perror("Read error");
}
free(buffer);
close(fd);
return 0;
}
ãã€ããªããŒã¿ã®èªã¿èŸŒã¿
read
é¢æ°ã¯ãããã¹ãããŒã¿ã ãã§ãªããç»åãã¡ã€ã«ãå®è¡ãã¡ã€ã«ãšãã£ããã€ããªããŒã¿ã®èªã¿åãã«ãé©ããŠããŸãããã€ããªããŒã¿ãæ±ãéã¯ãããŒã¿ã®ãšã³ãã£ã¢ã³ãæ§é äœã®ã¢ã©ã€ã³ã¡ã³ãã«æ³šæããå¿
èŠããããŸãã
ã³ãŒãäŸ: ãã€ããªãã¡ã€ã«ã®èªã¿åã
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdint.h>
typedef struct {
uint32_t id;
float value;
} DataRecord;
int main() {
int fd = open("data.bin", O_RDONLY);
if (fd == -1) {
perror("Failed to open file");
return 1;
}
DataRecord record;
ssize_t bytesRead;
while ((bytesRead = read(fd, &record, sizeof(record))) > 0) {
printf("ID: %u, Value: %.2f
", record.id, record.value);
}
if (bytesRead == -1) {
perror("Read error");
}
close(fd);
return 0;
}
ã³ãŒã解説
- æ§é äœã®èªã¿èŸŒã¿
read
é¢æ°ã§ã1åã®èªã¿åãã§æ§é äœå šäœãååŸããŸãã
- ããŒã¿åŠç
- æ§é äœã®ã¡ã³ããŒãçŽæ¥åç §ããŠããŒã¿ãåŠçã§ããŸãã
- ãšã³ãã£ã¢ã³ã®èæ ®
- ãã¡ã€ã«ãç°ãªããã©ãããã©ãŒã ã§çæãããå Žåããšã³ãã£ã¢ã³ã®å€æãå¿ èŠã«ãªãå ŽåããããŸãã
å¿çšäŸãŸãšã
read
é¢æ°ã®å¿çšã«ãããé«åºŠãªããã°ã©ãã³ã°ã¿ã¹ã¯ãå¹ççã«åŠçããããšãå¯èœã§ããéåæI/Oã掻çšããã°ã·ã¹ãã ãªãœãŒã¹ãå¹ççã«äœ¿ãã倧éããŒã¿ããã€ããªãã¡ã€ã«ã®èªã¿åããæè»ã«å¯Ÿå¿ã§ããŸãã
5. read
é¢æ°äœ¿çšæã®æ³šæç¹
read
é¢æ°ã¯æè»ã§åŒ·åãªããŒã«ã§ããã䜿çšããéã«ã¯æ³šæãã¹ããã€ã³ããããã€ããããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ãread
é¢æ°ãå®å
šãã€å¹ççã«å©çšããããã®éèŠãªæ³šæç¹ã解説ããŸãã
ãããã¡ãªãŒããŒãããŒã®é²æ¢
read
é¢æ°ã䜿çšããéãæå®ãããããã¡ãµã€ãºä»¥äžã®ããŒã¿ãèªã¿èŸŒããšãã¡ã¢ãªç Žå£ïŒãããã¡ãªãŒããŒãããŒïŒãçºçããå¯èœæ§ããããŸããããã«ãããããã°ã©ã ã®ã¯ã©ãã·ã¥ãã»ãã¥ãªãã£è匱æ§ãåŒãèµ·ããããå¯èœæ§ããããŸãã
察çæ¹æ³
- é©åãªãããã¡ãµã€ãºã®èšå®
- ãããã¡ãµã€ãºã¯ãäºæ³ãããããŒã¿ãµã€ãºä»¥äžã«ååãªå€§ããã確ä¿ããŸãã
read
é¢æ°ã®count
åŒæ°ã«ã¯ãããã¡ãµã€ãºä»¥äžã®å€ãèšå®ããŸãã
- ãããã¡ã®çµç«¯èšå®
- ãã€ããªããŒã¿ãæ±ããªãå Žåãèªã¿åã£ãããŒã¿ã®åŸã«å¿
ã
' '
ïŒNullæåïŒãè¿œå ããŠæååãšããŠæ±ããŸãã
ã³ãŒãäŸ: å®å šãªãããã¡ç®¡ç
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
char buffer[128];
int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Failed to open file");
return 1;
}
ssize_t bytesRead = read(fd, buffer, sizeof(buffer) - 1);
if (bytesRead == -1) {
perror("Failed to read file");
close(fd);
return 1;
}
buffer[bytesRead] = ' '; // ãããã¡ã®çµç«¯ãèšå®
printf("Data read: %s
", buffer);
close(fd);
return 0;
}
EOFïŒãã¡ã€ã«çµç«¯ïŒã®åŠçæ¹æ³
read
é¢æ°ã0ãè¿ããå Žåãããã¯EOFïŒEnd of File: ãã¡ã€ã«çµç«¯ïŒã瀺ããŸãããã®å ŽåãããŒã¿ã®èªã¿åãã¯å®äºããŠããŸããEOFã®æ±ãæ¹ã誀ããšãç¡éã«ãŒããç¡é§ãªåŠçãåŒãèµ·ããå¯èœæ§ããããŸãã
æ£ããEOFã®æ€åº
- æ»ãå€ã確èª
read
é¢æ°ã®æ»ãå€ã0
ã§ããã°ããã以äžããŒã¿ãèªã¿åããªãããšãæå³ããŸãã
- ã«ãŒãã§ã®æ¡ä»¶æå®
- EOFãæ£ããåŠçããããã«ãã«ãŒãæ¡ä»¶ã«
bytesRead > 0
ã䜿çšããŸãã
ã³ãŒãäŸ: EOFã®æ£ããåŠç
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
char buffer[128];
int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Failed to open file");
return 1;
}
ssize_t bytesRead;
while ((bytesRead = read(fd, buffer, sizeof(buffer) - 1)) > 0) {
buffer[bytesRead] = ' ';
printf("Data read: %s
", buffer);
}
if (bytesRead == -1) {
perror("Error while reading file");
}
close(fd);
return 0;
}
éšåèªã¿åãã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°
read
é¢æ°ã¯ãæå®ããããã€ãæ°ãã¹ãŠãäžåºŠã«èªã¿åãããšã¯éããŸãããç¹ã«ãœã±ããããã€ãã§äœ¿çšããå ŽåãéšåçãªããŒã¿ããèªã¿åããªãããšããããŸãããã®æåã¯ãããŒã¿ã®å°çã¿ã€ãã³ã°ãã·ã¹ãã ã®ç¶æ
ã«ãã£ãŠåœ±é¿ãåããŸãã
åå
- ã·ã°ãã«ã®åœ±é¿
- ã·ã¹ãã ã³ãŒã«ãã·ã°ãã«ã«ãã£ãŠäžæããããšã
read
é¢æ°ãéäžã§åæ¢ããããšããããŸãã
- éããããã³ã°ã¢ãŒã
- éããããã³ã°ã¢ãŒãã§ã¯ãå©çšå¯èœãªããŒã¿ãäžè¶³ããŠããå Žåã«å³åº§ã«æ»ããŸãã
- ãããã¡ãµã€ãºã®äžè¶³
- äžåºŠã®
read
åŒã³åºãã§ãããã¡ã«åãŸããªãããŒã¿ãããå Žåãè€æ°åã®èªã¿åããå¿ èŠã§ãã
解決æ¹æ³
- åè©Šè¡åŠç
- éšåèªã¿åããçºçããå Žåãæ®ãã®ããŒã¿ãå床èªã¿åãã«ãŒããå®è£ ããŸãã
- ãšã©ãŒã³ãŒãã®ç¢ºèª
errno
ã䜿çšããŠãEINTR
ãEAGAIN
ã®ãããªç¹å®ã®ãšã©ãŒã³ãŒãã«å¿ããåŠçãè¿œå ããŸãã
ã³ãŒãäŸ: éšåèªã¿åãã®å¯Ÿå¿
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
int main() {
char buffer[128];
int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Failed to open file");
return 1;
}
ssize_t bytesRead;
size_t totalBytesRead = 0;
while ((bytesRead = read(fd, buffer + totalBytesRead, sizeof(buffer) - totalBytesRead - 1)) > 0) {
totalBytesRead += bytesRead;
}
if (bytesRead == -1 && errno != EINTR) {
perror("Read error");
} else {
buffer[totalBytesRead] = ' ';
printf("Total data read: %s
", buffer);
}
close(fd);
return 0;
}
䜿çšæã®æ³šæç¹ãŸãšã
- ãããã¡ãµã€ãºãåžžã«é©åã«èšå®ããå®å šæ§ã確ä¿ããã
- EOFã®æ€åºãæ£ããå®è£ ããç¡é§ãªåŠçãé¿ããã
- éšåèªã¿åããçºçããå Žåãã«ãŒãåŠçããšã©ãŒã³ãŒãã掻çšããŠå¯ŸåŠããã
ãããã®æ³šæç¹ãç解ãå®è·µããããšã§ãread
é¢æ°ãå®å
šãã€å¹ççã«æŽ»çšã§ããŸãã
6. ãããã質åïŒFAQïŒ
ããã§ã¯ãCèšèªã®read
é¢æ°ã«é¢ããŠèªè
ãæ±ããããçåãåãäžãããã®è§£æ±ºçããã€ã³ãã解説ããŸããåå¿è
ããäžçŽè
ãŸã§ãç解ãæ·±ããã®ã«åœ¹ç«ã€å
容ãæäŸããŸãã
Q1. read
é¢æ°ãšfread
é¢æ°ã®éãã¯ïŒ
åçïŒ
read
é¢æ°:- ã·ã¹ãã ã³ãŒã«ã§ãOSãçŽæ¥æäœããŸãã
- ãã¡ã€ã«ãã£ã¹ã¯ãªãã¿ã䜿çšããŠäœã¬ãã«ãªå ¥åºåãè¡ããŸãã
- æè»æ§ãé«ãäžæ¹ã§ããšã©ãŒåŠçããããã¡ç®¡çãå¿ èŠã§ãã
fread
é¢æ°:- æšæºCã©ã€ãã©ãªã®é¢æ°ã§ãé«ã¬ãã«ãªå ¥åºåãæäŸããŸãã
- ãã¡ã€ã«ãã€ã³ã¿ã䜿çšããŠã¹ããªãŒã ããããŒã¿ãèªã¿åããŸãã
- ãããã¡ç®¡çãèªåçã«è¡ããããããç°¡åã«äœ¿çšã§ããŸãã
䜿ãåãã®ãã€ã³ãïŒ
read
é¢æ°: ã·ã¹ãã ããã°ã©ãã³ã°ããœã±ããéä¿¡ã®ãããªäœã¬ãã«ãªæäœãå¿ èŠãªå Žåã«äœ¿çšããŸããfread
é¢æ°: äžè¬çãªãã¡ã€ã«æäœã§ç°¡äŸ¿ããéèŠããå Žåã«äœ¿çšããŸãã
Q2. read
é¢æ°ã0ãè¿ãå Žåãããã¯ãšã©ãŒã§ããïŒ
åçïŒ
ããããread
é¢æ°ã0
ãè¿ãå Žåãããã¯EOFïŒEnd of File: ãã¡ã€ã«çµç«¯ïŒãæå³ããŸããããã¯æ£åžžãªåäœã§ããããã¡ã€ã«å
ã®ããŒã¿ããã¹ãŠèªã¿åãããããšã瀺ããŠããŸãã
察åŠæ¹æ³ïŒ
- EOFãæ€åºãããããèªã¿åãåŠçãçµäºããŠãã ããã
- ã«ãŒãã§
read
ã䜿çšããå Žåã¯ãbytesRead > 0
ãæ¡ä»¶ã«ããããšã§EOFãé©åã«åŠçã§ããŸãã
Q3. éããããã³ã°ã¢ãŒãã§read
é¢æ°ã䜿çšããæ¹æ³ã¯ïŒ
åçïŒ
éããããã³ã°ã¢ãŒãã§ã¯ãread
é¢æ°ãããŒã¿ã®å°çãåŸ
ããã«å³åº§ã«æ»ããŸãããã®èšå®ã¯ã以äžã®ããã«fcntl
é¢æ°ã䜿çšããŠè¡ããŸãã
ã³ãŒãäŸïŒ
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
int main() {
int fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("Failed to open file");
return 1;
}
// éããããã³ã°ã¢ãŒããèšå®
int flags = fcntl(fd, F_GETFL, 0);
if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
perror("Failed to set non-blocking mode");
close(fd);
return 1;
}
char buffer[128];
ssize_t bytesRead = read(fd, buffer, sizeof(buffer));
if (bytesRead == -1 && errno == EAGAIN) {
printf("No data available at the moment
");
} else if (bytesRead > 0) {
buffer[bytesRead] = ' ';
printf("Data read: %s
", buffer);
}
close(fd);
return 0;
}
泚æç¹ïŒ
- ããŒã¿ãå©çšå¯èœã§ãªãå Žåã
read
é¢æ°ã¯-1
ãè¿ããerrno
ãEAGAIN
ãŸãã¯EWOULDBLOCK
ã«èšå®ãããŸãã - éåæåŠçã«æ £ããŠããªãå ŽåãããŒãªã³ã°ãã€ãã³ãé§ååããã°ã©ãã³ã°ã®ç¥èãå¿ èŠã§ãã
Q4. read
é¢æ°ã-1
ãè¿ããå Žåãã©ãããã°ããã§ããïŒ
åçïŒ
read
é¢æ°ã-1
ãè¿ãå Žåãããã¯ãšã©ãŒãçºçããããšãæå³ããŸãããšã©ãŒã®è©³çŽ°ã¯ãã°ããŒãã«å€æ°errno
ã§ç¢ºèªã§ããŸãã
äž»ãªãšã©ãŒã³ãŒãïŒ
EINTR
:
ã·ã°ãã«ã«ããread
ãäžæãããŸãããåŠçããªãã©ã€ããå¿ èŠããããŸããEAGAIN
ãŸãã¯EWOULDBLOCK
:
éããããã³ã°ã¢ãŒãã§ãããŒã¿ãå©çšå¯èœã§ãªãç¶æ ã§ãã- ãã®ä»ã®ãšã©ãŒ:
ãã¡ã€ã«ãã£ã¹ã¯ãªãã¿ãç¡å¹ïŒEBADF
ïŒã§ããå Žåãªã©ã
察åŠäŸïŒ
if (bytesRead == -1) {
if (errno == EINTR) {
// ãªãã©ã€åŠç
} else {
perror("Read failed");
}
}
Q5. ãã¡ã€ã«ãµã€ãºã倧ããããå Žåãã©ãåŠçããã°ããã§ããïŒ
åçïŒ
read
é¢æ°ã䜿çšããŠå€§ããªãã¡ã€ã«ãåŠçããå Žåã以äžã®æ¹æ³ãæ€èšããŠãã ããã
- åå²èªã¿èŸŒã¿
- ãããã¡ãµã€ãºãèšå®ããã«ãŒãã§ç¹°ãè¿ã
read
ãåŒã³åºããŸãã
- ã¡ã¢ãªå¹çã®èæ ®
- åçã¡ã¢ãªå²ãåœãŠïŒ
malloc
ïŒã䜿çšããŠå¿ èŠã«å¿ããŠãããã¡ãµã€ãºãæ¡åŒµããŸãã
ã³ãŒãäŸïŒ
char buffer[4096]; // 4KBã®ãããã¡
while ((bytesRead = read(fd, buffer, sizeof(buffer))) > 0) {
// ããŒã¿ãåŠçãã
}
Q6. read
é¢æ°ã§ããŒã¿ãéäžã§éåããã®ã¯ãªãã§ããïŒ
åçïŒ
ããŒã¿ãéäžã§éåããåå ã¯ã以äžã®ãããªçç±ãèããããŸãã
- éšåèªã¿åã
- æå®ããããã€ãæ°ãã¹ãŠãäžåºŠã«èªã¿åãããªãå ŽåããããŸããç¹ã«ãœã±ããããã€ãã§ã¯ããèŠãããæåã§ãã
- ã·ã°ãã«ã®åœ±é¿
- ã·ã°ãã«ãçºçãããšã
read
ãäžæãããããšããããŸãã
- éããããã³ã°ã¢ãŒãã®åœ±é¿
- å©çšå¯èœãªããŒã¿éãéãããŠããå Žåã«èµ·ãããŸãã
察çïŒ
- ããŒã¿ãå®å
šã«èªã¿åããŸã§
read
ãç¹°ãè¿ãèšèšãæ¡çšããŸãã - ã·ã°ãã«ããšã©ãŒã³ãŒããé©åã«åŠçããŸãã
FAQãŸãšã
ãããã®è³ªåãšåçãéããŠãread
é¢æ°ã«é¢ããå
žåçãªåé¡ãçåç¹ã解æ¶ã§ããã¯ãã§ããç¹ã«ããšã©ãŒåŠçãç¹æ®ãªäœ¿çšç¶æ³ïŒéããããã³ã°ã¢ãŒããEOFã®åŠçïŒã«ã€ããŠã¯ãååãªç解ãéèŠã§ãã
![](https://www.cmastery.digibeatrix.com/wp-content/themes/the-thor/img/dummy.gif)
7. ãŸãšã
ãã®èšäºã§ã¯ãCèšèªã®read
é¢æ°ã«ã€ããŠãåºæ¬çãªäœ¿ãæ¹ããå¿çšäŸããããŠæ³šæç¹ãFAQãŸã§å¹
åºã解説ããŸããããã®ã»ã¯ã·ã§ã³ã§ã¯ãèšäºå
šäœã®å
容ãæ¯ãè¿ããéèŠãªãã€ã³ããæŽçããŸãã
read
é¢æ°ã®åºæ¬çãªæŠèŠ
- æŠèŠ:
read
é¢æ°ã¯ããã¡ã€ã«ãã£ã¹ã¯ãªãã¿ã䜿çšããŠããŒã¿ãèªã¿åãäœã¬ãã«I/Oé¢æ°ã§ãã - æ§æ:
ssize_t read(int fd, void *buf, size_t count);
- äž»ãªç¹åŸŽ:
- æè»æ§ãé«ãããã¡ã€ã«ãããã€ã¹ããœã±ããéä¿¡ãªã©å¹ åºãçšéã«å¯Ÿå¿ã
- ã·ã¹ãã ã³ãŒã«ãšããŠåäœãããšã©ãŒåŠçããããã¡ç®¡çãå¿ èŠã
äž»ãªäœ¿çšäŸ
- ãã¡ã€ã«ããã®èªã¿åã:
ãã¡ã€ã«ãéããŠå 容ãèªã¿åãåºæ¬çãªäŸã玹ä»ããŸãããã«ãŒãåŠçã䜿çšããŠEOFãŸã§èªã¿åãæ¹æ³ã解説ããŸããã - æšæºå
¥åããã®ããŒã¿ååŸ:
ãŠãŒã¶ãŒå ¥åãread
é¢æ°ã§ååŸããåºåããç°¡åãªããã°ã©ã ãæ瀺ããŸããã - ãœã±ããéä¿¡ã§ã®ããŒã¿åä¿¡:
ãµãŒããŒ/ã¯ã©ã€ã¢ã³ãéã§ããŒã¿ãåãåãéã«read
ã䜿çšããæ¹æ³ãå ·äœäŸã§ç€ºããŸããã
å¿çšçãªäœ¿ãæ¹
- éåæI/O:
fcntl
ã䜿çšããŠéããããã³ã°ã¢ãŒããèšå®ããããŒã¿ãå©çšå¯èœã«ãªããŸã§åŸ æ©ããã«åŠçãé²ããæ¹æ³ã玹ä»ããŸããã - 倧éããŒã¿ã®å¹ççãªåŠç:
倧ããªãã¡ã€ã«ãããŒã¿ãå¹ççã«åŠçããããã«ãé©åãªãããã¡ãµã€ãºãèšå®ããã¡ã¢ãªç®¡çãèæ ®ããéèŠæ§ã説æããŸããã - ãã€ããªããŒã¿ã®èªã¿åã:
æ§é äœã䜿çšããŠãã€ããªããŒã¿ãå®å šã«èªã¿åãæ¹æ³ã解説ããŸããã
泚æç¹ãšãã©ãã«ã·ã¥ãŒãã£ã³ã°
- ãããã¡ãªãŒããŒãããŒ:
read
é¢æ°ã䜿çšããéããããã¡ãµã€ãºä»¥äžã®ããŒã¿ãèªã¿èŸŒãŸãªããããé©åãªå¶åŸ¡ãå¿ èŠã§ãã - EOFïŒãã¡ã€ã«çµç«¯ïŒã®åŠç:
read
ã0ãè¿ãå Žåããã¡ã€ã«çµç«¯ã§ããããšãé©åã«åŠçããå¿ èŠããããŸãã - éšåèªã¿åã:
ãœã±ãããéããããã³ã°ã¢ãŒãã§éšåçã«ããããŒã¿ãååŸã§ããªãå Žåã®å¯ŸåŠæ³ã解説ããŸããã
FAQã§è§£æ±ºããäž»ãªçå
read
é¢æ°ãšfread
é¢æ°ã®éã
read
ã¯äœã¬ãã«I/Oãfread
ã¯é«ã¬ãã«I/Oã
- éããããã³ã°ã¢ãŒãã®èšå®æ¹æ³
fcntl
ã§éåæI/Oãèšå®ããerrno
ã§ç¶æ ã確èªã
- ãšã©ãŒåŠçã®ãã¹ããã©ã¯ãã£ã¹
errno
ã®å€ã«å¿ããé©åãªå¯ŸåŠæ³ã
ãã®èšäºãéããŠåŠãã ããš
read
é¢æ°ã®åºæ¬çãªäœ¿ãæ¹:
ãã¡ã€ã«ãå ¥åããã€ã¹ããããŒã¿ãå®å šã«èªã¿åãæ¹æ³ã- å¿çšçãªå©çšæ¹æ³:
éåæI/Oããã€ããªããŒã¿ã®åŠçãªã©ãå®è·µçãªããã°ã©ãã³ã°ã«ãããå¿çšäŸã - ãšã©ãŒããã©ãã«ãžã®å¯ŸåŠ:
éšåèªã¿åããEOFã®æ£ããåŠçæ¹æ³ãç解ããããšã§ãå ç¢ãªã³ãŒããæžãã¹ãã«ã身ã«ã€ããŸããã
次ã«åŠã¶ã¹ãããš
read
é¢æ°ãåŠãã 次ã®ã¹ããããšããŠã以äžã®ããŒããæ·±æããããšããç解ãæ·±ãŸããŸãã
write
é¢æ°:
ãã¡ã€ã«ãããã€ã¹ã«ããŒã¿ãæžã蟌ãäœã¬ãã«I/Oé¢æ°ãopen
é¢æ°ãšclose
é¢æ°:
ãã¡ã€ã«æäœã®åºæ¬çãªä»çµã¿ãåŠã¶ã- éåæåŠç:
ã€ãã³ãé§ååããã°ã©ãã³ã°ãéåæI/Oããã詳ããåŠã³ãå¹ççãªããã°ã©ã ãäœæã
æåŸã«
read
é¢æ°ã¯ãCèšèªã§ãã¡ã€ã«ãããã€ã¹æäœãè¡ãäžã§æ¬ ãããªãããŒã«ã§ãããã®æè»æ§ãšæ§èœãåŒãåºãããã«ã¯ãæ£ãã䜿ãæ¹ãšæ³šæç¹ãç解ããããšãéèŠã§ãããã®èšäºããåå¿è
ããäžçŽè
ã®ããã°ã©ããŒãŸã§ãread
é¢æ°ã䜿ãããªãæå©ãã«ãªãã°å¹žãã§ãã