|
|
不知道这个程序错在哪里? 请高手指点!
代码: #include
#include
#include
#include
int
main(void)
{
size_t n,tmp;
char *c;
int fd;
if((fd=open("/etc/fstab",O_RDONLY))<0) { /* open /etc/fstab file */
printf("open fstab error\n");
return(1);
}
for(n=1;n<10;n++) {
if((tmp=read(fd,&c,1)) != 1) { /* read 1 byte */
printf("read %d error\n",n);
return(1);
} else {
if(write(STDOUT_FILENO,&c,tmp)<0) { /* write the byte to
stdout */
printf("write %d error",n) ;
return(1);
}
}
*c +=1; /* memory point add 1 byte */
}
return(0);
} |
代码: #include
#include
#include
#include
int
main(void)
{
size_t n; /* tmp不需要 */
char c; /* 注意这里 */
int fd;
if((fd = open("/etc/fstab", O_RDONLY)) < 0) { /* open /etc/fstab file */
printf("open fstab error\n");
return(1);
}
for(n=1; n<10; n++){ /* C语言中很少用n=1的,一般用n=0 */
if(read(fd, &c, 1) != 1) { /* read 1 byte */
printf("read %d error\n", n);
return(1);
}else{
if(write(STDOUT_FILENO, &c, 1) != 1) { /* write the byte to
stdout */
printf("write %d error", n) ;
return(1);
}
}
}
return(0);
} |
| |
| | |
|
read()和write()的用法我是看这个例程的,但我看了很久都看不懂@@@@ 代码: #include "unp.h"
ssize_t
readline(int fd,void *vptr,size_t maxlen)
{
ssize_t n,rc;
char c,*ptr;
ptr=vptr;
for(n=1;n |
从一个描述字读文本文件,一次一个字节@-@,难道教程错了,我也感到上一贴read() and writea()的用法不对头/ |
|
| |
| 用read的时候,很多时候都不需要一个指向文件的指针的,直接就可以用了,read里有个文件指针,这是steven自己写的一个读一行的函数,if read那,不知道你有没有贴错,应该是不等于? |
|
|
| 楼上的说法不够准确。read使用的是文件描述符,fread使用的才是文件指针。 在if((rc=read(fd,&c,1)) == 1) 中read(fd,&c, 1)的返回值是实际读取的字节数,而fread()返回的是实际读取的数据项数。你可以仔细看看它们的man文档。 |
| //nod open/read/write/gets/getc等是linux直接提供的系统调用 fopen/fread/fwrite/fgets/fgetc/feof等是标准库函数,用文件流输入输出,是在系统调用的基础上增加了buffer实现的。 两套函数的标识符(或者说是文件句柄)是不能混用的。只能通过fdopen或者fileno来显式转换 |
帮忙阿!!!没见过这种用法: if((rc=read(fd,&c,1)) == 1) { 特别是&c,按照我的程序怎么写出你,请大家改改。。。。。。。 &c有什么问题吗?取变量c的地址 char c; &c就是char * 象你前面写的 char *c; 那么&c就成了char **了
清问改成这样怎么会不行?? char c; &c +=1; /* memory point add 1 byte */ 这是测试的程序: 代码: int
main(void)
{
char a;
printf("%p %p\n",&a,&a+1);
printf("%p\n",&a+sizeof(char));
return(0);
}
# ./a.out
0xbfffed67 0xbfffed68
0xbfffed68 |
|
你应该找一本C语言的书,把指针这一章好好读一下 char c;定义了一个变量 &c取变量c的地址,但是取到的地址可不是变量,比如你的例子 &c是0xbfffed67,那么 &c += 1;就成了0xbfffed67 += 1;当然不对了 或者说&c不是一个左值(lvalue) 这个为什么有错误,请问错在哪里? 代码: #include
#include
#include
#include
int
main(void)
{
char buf[10];
int fd;
unsigned loop;
if((fd=open("/etc/fstab",O_RDONLY))<0) { /* open /etc/fstab file */
printf("open fstab error\n");
return(1);
}
if(read(fd,buf,10) != 10) {
printf("read error\n");
return(1);
}
for(loop=0;loop<10;loop++) {
if(fputs(buf[loop],stdout)<0) {
printf("fputs error\n");
return(1);
}
}
return(0);
}
# gcc -c get_1_byte_v3.c
get_1_byte_v3.c: In function `main':
get_1_byte_v3.c:21: warning: passing arg 1 of `fputs' makes pointer from integer without a cast |
我不太明白你这段要实现什么功能: 代码: for(loop=0;loop<10;loop++) {
if(fputs(buf[loop],stdout)<0) {
printf("fputs error\n");
return(1);
}
} |
如果是输出单个字符的话应该用 if(fputc(buf[loop], stdout) == EOF) 谢谢!!这是一次写一个字符,,看来函数不能乱用。。 这个程序在UNIX下就可以编译并正常运行,在LINUX就不可以编译通过,在LINUX怎么些呢? 代码: #include
#include
#include
int
main(void)
{
int fd,n;
char buf[10];
if((fd=open("/etc/fstab",O_RDONLY))<0) {
printf("open file error\n");
return(1);
}
for(n=0;n<10;n++) {
if(read(fd,&buf[n],1) != 1 ) {
printf("read error\n");
return(1);
}
if(write(STDOUT_FILENO,&buf[n],1) == NULL ) {
printf("write error\n");
return(1);
}
}
return(0);
}
# gcc -c get_1_byte.d.c
get_1_byte.d.c: In function `main':
get_1_byte.d.c:18: warning: comparison between pointer and integer
|
|
| 晕?!!write()返回的是字节数,并且出错是返回的是-1。if(write(STDOUT_FILENO,&buf[n],1) == NULL )应该改成if(write(STDOUT_FILENO,&buf[n],1) < 0 ) |
| |
|
|