使用 read() c 从文件中读取整数
read integer from file with read() c
我对文件 read() 函数有疑问。我的文件是这样的:
4boat
5tiger
3end
其中数字是后面字符串的长度。我需要从输入文件中读取整数和字符串,并使用低级别 I/O 在 stdoutput 上打印它们。这是我的代码:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
int main(int argc, char *argv[]){
int *len, fd, r_l, r_s;
char *s;
fd=open(argv[1], O_RDONLY);
if(fd>=0){
do{
r_l=read(fd, len, sizeof(int));
r_s=read(fd, s, (*len)*sizeof(char));
if(r_l>=0){
write(1, len, sizeof(int));
write(1, " ",sizeof(char));
}
if(r_s>=0)
write(1, s, (*len)*sizeof(char));
}while(r_l>=0 && r_s>=0);
}
return 0;
}
但是不行=/
您没有为指针 len
分配 space,您需要为其分配 space,只需将其声明为 int len;
即可,因此它在堆栈中分配,你不需要手动处理它的分配,所以它会像这样
int main(void) {
int len, fd, r_l, r_s;
char *s;
fd = open(argv[1], O_RDONLY);
if (fd >= 0) {
do {
r_l = read(fd, &len, sizeof(int));
s = malloc(len); /* <--- allocate space for `s' */
r_s = 0;
if (s != NULL)
r_s = read(fd, s, len);
if (r_l >= 0) {
write(1, &len, sizeof(int));
write(1, " ", 1);
}
if ((r_s >= 0) && (s != NULL))
write(1, s, len);
free(s);
} while (r_l >= 0 && r_s >= 0);
close(fd);
}
return 0;
}
你也没有为 s
分配 space 这是另一个问题,我确实在上面更正的代码中使用 [= 为 s
分配了 space 16=].
根据定义 sizeof(char) == 1
,因此您不需要它。
尽管上面的代码不会出现您的代码所具有的调用未定义行为的错误,但它不会执行您期望的操作,因为无法使用此算法读取您的数据。
你文件中的数字并不是真正的整数,它们是字符,所以你真正需要的是这个
int main(void) {
char chr;
int len, fd, r_l, r_s;
char *s;
fd = open(argv[1], O_RDONLY);
if (fd >= 0) {
do {
r_l = read(fd, &chr, 1);
len = chr - '0';
s = malloc(len); /* <--- allocate space for `s' */
r_s = 0;
if (s != NULL)
r_s = read(fd, s, len);
if (r_l >= 0) {
printf("%d ", len);
}
if ((r_s >= 0) && (s != NULL))
write(1, s, len);
free(s);
} while (r_l >= 0 && r_s >= 0);
close(fd);
}
return 0;
}
我对文件 read() 函数有疑问。我的文件是这样的:
4boat
5tiger
3end
其中数字是后面字符串的长度。我需要从输入文件中读取整数和字符串,并使用低级别 I/O 在 stdoutput 上打印它们。这是我的代码:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
int main(int argc, char *argv[]){
int *len, fd, r_l, r_s;
char *s;
fd=open(argv[1], O_RDONLY);
if(fd>=0){
do{
r_l=read(fd, len, sizeof(int));
r_s=read(fd, s, (*len)*sizeof(char));
if(r_l>=0){
write(1, len, sizeof(int));
write(1, " ",sizeof(char));
}
if(r_s>=0)
write(1, s, (*len)*sizeof(char));
}while(r_l>=0 && r_s>=0);
}
return 0;
}
但是不行=/
您没有为指针 len
分配 space,您需要为其分配 space,只需将其声明为 int len;
即可,因此它在堆栈中分配,你不需要手动处理它的分配,所以它会像这样
int main(void) {
int len, fd, r_l, r_s;
char *s;
fd = open(argv[1], O_RDONLY);
if (fd >= 0) {
do {
r_l = read(fd, &len, sizeof(int));
s = malloc(len); /* <--- allocate space for `s' */
r_s = 0;
if (s != NULL)
r_s = read(fd, s, len);
if (r_l >= 0) {
write(1, &len, sizeof(int));
write(1, " ", 1);
}
if ((r_s >= 0) && (s != NULL))
write(1, s, len);
free(s);
} while (r_l >= 0 && r_s >= 0);
close(fd);
}
return 0;
}
你也没有为 s
分配 space 这是另一个问题,我确实在上面更正的代码中使用 [= 为 s
分配了 space 16=].
根据定义 sizeof(char) == 1
,因此您不需要它。
尽管上面的代码不会出现您的代码所具有的调用未定义行为的错误,但它不会执行您期望的操作,因为无法使用此算法读取您的数据。
你文件中的数字并不是真正的整数,它们是字符,所以你真正需要的是这个
int main(void) {
char chr;
int len, fd, r_l, r_s;
char *s;
fd = open(argv[1], O_RDONLY);
if (fd >= 0) {
do {
r_l = read(fd, &chr, 1);
len = chr - '0';
s = malloc(len); /* <--- allocate space for `s' */
r_s = 0;
if (s != NULL)
r_s = read(fd, s, len);
if (r_l >= 0) {
printf("%d ", len);
}
if ((r_s >= 0) && (s != NULL))
write(1, s, len);
free(s);
} while (r_l >= 0 && r_s >= 0);
close(fd);
}
return 0;
}