中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
怎么每次读和写一个字节从一个文件?
作者:未知 时间:2005-09-13 23:29 出处:Blog.ChinaUnix.net 责编:chinaitpower
              摘要:怎么每次读和写一个字节从一个文件?
晕?!!write()返回的是字节数,并且出错是返回的是-1。if(write(STDOUT_FILENO,&buf[n],1) == NULL )应该改成if(write(STDOUT_FILENO,&buf[n],1) < 0 )

用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 **了
 
发帖时间: 04-03-27, 22:45
 不知道这个程序错在哪里?
请高手指点!
代码:
#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);
}

 

发帖时间: 04-03-26, 20:34


代码:
#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);
}
libinary离线中
回复时引用此帖 快速回复此帖
devel的头像
资 料:
已封禁
注册日期: Sep 2003
来自: 自由的世界 !
帖子: 1,461
精华: 7
  向版主反映此帖   第 6 帖  
发帖时间: 04-03-26, 20:36


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()的用法不对头/



清问改成这样怎么会不行??
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
 
关闭本页  
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有