while(!feof(fp1)),使用feof()的时候会比你期望的多执行一次。因为它检测到结尾的'\0',时仍然不是文件的结尾,所以会继续执行一次。为解决这个问题,可以先读,在判断,然后打印

fread(&n,sizeof(int),1,fp1); // feof是检测上次读取文件内容是否是结束,这回造成最后内容会重读一次

while(!feof(fp1))
{
fread(&n,sizeof(int),1,fp1);
printf("%d ",n);
}

判断文件为空的方法:

int main(void)
{
   FILE *stream;
   if ((stream = fopen("a.conf", "r+")) == NULL)
   {
      return 1;
   }
        fseek( stream, 0, SEEK_END );
        if( ftell( stream ) == 0)
             printf("null");
          else
                 printf("full");
   fclose(stream);
   return 0;
}

在路径下打开一个文件:

#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
fp = fopen("d:\\1.txt","w"); /*fp = fopen("d:\1.txt","w");是错误的,必须把\字符进行转义

同样也可以改为fp = fopen("d:/1.txt","w"); 很神奇哦。*/
if(fp == NULL)
{printf("cannot open file.\n");
    exit(1);
}
printf("ok\n");
    fclose(fp);
return 0;
}

fseek()的使用: 函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。成功,返回0,否则返回其他值。

  SEEK_SET: 文件开头

  SEEK_CUR: 当前位置

  SEEK_END: 文件结尾

  其中SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2.
第二个参数表示相对于第三个参数的偏移,整数表示正向偏移,负数表示负向偏移,比如
fseek(fp,-size,SEEK_CUR);
从当前位置向文件后方(比如文件有123三个数字,那么2在三的后方,3在2的前方)
fseek(fp,size,SEEK_SET);
从文件开始位置向前移动size

1.
函数名: fgets
功 能: 从流中读取一字符串
用 法: char *fgets(char *string, int n, FILE *stream);
形参注释:*string结果数据的首地址;n-1:一次读入数据块的长度,其默认值为1k,即1024;stream文件指针
序 例:

#include <string.h>
#include <stdio.h>

int main(void)
{
FILE *stream;
char string[] = "This is a test";
char msg[20];

/* open a file for update */
stream = fopen("DUMMY.FIL", "w+");

/* write a string into the file */
fwrite(string, strlen(string), 1, stream);

/* seek to the start of the file */
fseek(stream, 0, SEEK_SET);

/* read a string from the file */
fgets(msg, strlen(string)+1, stream);

/* display the string */
printf("%s", msg);

fclose(stream);
return 0;
}
fgets函数fgets函数用来从文件中读入字符串。fgets函数的调用形式如下:fgets(str,n,fp);此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加'\0',并以str作为函数值返回。

2.
函数名: fread
功  能: 从一个流中读数据
用  法: int fread(void *ptr, int size, int nitems, FILE *stream);
参  数:用于接收数据的地址(字符型指针)(ptr)
        单个元素的大小(size)
        元素个数(nitems)
        提供数据的文件指针(stream)
返回值:成功读取的元素个数

程序例:

#include <string.h>
#include <stdio.h>

int main(void)
{
   FILE *stream;
   char msg[] = "this is a test";
   char buf[20];

if ((stream = fopen("DUMMY.FIL", "w+"))
       == NULL)
   {
      fprintf(stderr,
              "Cannot open output file.\n");
      return 1;
   }

/* write some data to the file */
   fwrite(msg, strlen(msg)+1, 1, stream);

/* seek to the beginning of the file */
   fseek(stream, 0, SEEK_SET);

/* read the data and display it */
   fread(buf, 1, strlen(msg)+1, stream);
   printf("%s\n", buf);

fclose(stream);
   return 0;
}

3.
函数名: fwrite
功 能: 写内容到流中
用 法:fwrite(buffer,size,count,fp);
(1)buffer:是一个指针,对fwrite来说,是要输出数据的地址。
(2)size:要写入的字节数;
(3)count:要进行写入size字节的数据项的个数;
(4)fp:目标文件指针。
程序例:

#include <stdio.h>

struct mystruct
{
int i;
char ch;
};

int main(void)
{
FILE *stream;
struct mystruct s;

if ((stream = fopen("TEST.$$$", "wb")) == NULL) /* open file TEST.$$$ */
{
fprintf(stderr, "Cannot open output file.\n");
return 1;
}
s.i = 0;
s.ch = 'A';
fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */
fclose(stream); /* close file */
return 0;
}

4.
fopen(打开文件)
相关函数  open,fclose
表头文件  #include<stdio.h>
定义函数  FILE * fopen(const char * path,const char * mode);
函数说明  参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
mode有下列几种形态字符串:
r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask 值。
返回值
文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。
附加说明
一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。

打开文件函数

fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式)。其中,“文件指针名”必须是被说明为FILE 类型的指针变量,“文件名”是被打开文件的文件名。 “使用文件方式”是指文件的类型和操作要求。“文件名”是字符串常量或字符串数组。

说明:

(1)文件名是一个字符串或者是一个字符数组。文件名指出了文件所在的盘符、路径和文件的名字。

(2)文件的使用方式是一个字符串,指出对指定文件的使用方式。常用的使用方式有下面所列出的几种。

“rt”      只读打开一个文本文件,只允许读数据
“wt”      只写打开或建立一个文本文件,只允许写数据
“at”      追加打开一个文本文件,并在文件末尾写数据
“rb”      只读打开一个二进制文件,只允许读数据
“wb”       只写打开或建立一个二进制文件,只允许写数据
“ab”       追加打开一个二进制文件,并在文件末尾写数据
“rt+”      读写打开一个文本文件,允许读和写
“wt+”      读写打开或建立一个文本文件,允许读写
“at+”      读写打开一个文本文件,允许读,或在文件末追加数 据
“rb+”      读写打开一个二进制文件,允许读和写
“wb+”      读写打开或建立一个二进制文件,允许读和写
“ab+”      读写打开一个二进制文件,允许读,或在文件末追加数据

(3)fopen函数的返回值是与打开文件相联系的文件指针。在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。因此常用以下程序段打开文件:

if((fp=fopen("c:\\hzk16","rb")==NULL)
{
printf("\nerror on open c:\\hzk16 file!");
getchar();
exit(0);
}

这段程序的意义是,如果返回的指针为空,表示不能打开C盘根目录下的hzk16文件,则给出提示信息“error on open c:\ hzk16file!”,下一行getchar()的功能是从键盘输入一个字符,但不在屏幕上显示。在这里,该行的作用是等待, 只有当用户从键盘敲任一键时,程序才继续执行, 因此用户可利用这个等待时间阅读出错提示。敲键后执行exit(0)退出程序。

【例程】
#include <stdlib.h>
#include <stdio.h>
#include <dir.h>

int main(void)
{
    char *s;
    char drive[MAXDRIVE];
    char dir[MAXDIR];
    char file[MAXFILE];
    char ext[MAXEXT];
    int flags;

s=getenv("COMSPEC"); /* get the comspec environment parameter */
    flags=fnsplit(s,drive,dir,file,ext);

printf("Command processor info:\n");
    if(flags & DRIVE)
       printf("\tdrive: %s\n",drive);
    if(flags & DIRECTORY)
       printf("\tdirectory: %s\n",dir);
    if(flags & FILENAME)
       printf("\tfile: %s\n",file);
    if(flags & EXTENSION)
       printf("\textension: %s\n",ext);

return 0;
}

5.snprintf ,sprintf, sscanf

int snprintf(char *restrict buf, size_t n, const char * restrict  format, ...);

函数说明:最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n的话,将不会溢出。

函数返回值:若成功则返回存入数组的字符数,若编码出错则返回负值。

Result1(推荐的用法)

1 #include <stdio.h>

2 #include <stdlib.h>

3

4 int main()

5 {

6

7     char str[10];

8     snprintf(str,sizeof(str),"0123456789012345678");

9     printf("str = %s \n",str);

10     return 0;

11 }

root@darkstar:/home/zhangl/unixtest/chapter9# ./testsprintf

str = 012345678

Result2:(不推荐使用)

1 #include <stdio.h>

2 #include <stdlib.h>

3

4 int main()

5 {

6

7     char str[10];

8     snprintf(str,18,"0123456789012345678");

9     printf("str = %s \n",str);

10     return 0;

11 }

root@darkstar:/home/zhangl/unixtest/chapter9# ./testsprintf

str = 01234567890123456

snprintf函数返回值的测试:

1 #include <stdio.h>
        2 #include <stdlib.h>
        3
        4    int main()
        5 {
        6        char str[10];
        7        int n=0;
        8
        9        n=snprintf(str,sizeof(str),"%s","abc");
       10        printf("str = %s \n",str);
       11        printf("n=%d\n",n);
       12
       13        return 0;
       14 }

Result:

root@darkstar:/home/zhangl/test# ./testsnprintf    
str = abc
n=3

我的str.c程序如下(并使用strcat()函数):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
main()
{
    char *s="wed sep  1 01:10:02 2008";
char *f="asd";
    char d[25];
    char b[10];  //这里若是b[9]就出现段错误了。
    char m[9];
    char n[9];
    char c[6];

printf("1\n");
    d[0]='\0';
    snprintf(b,9,s+11);
    printf("%s\n",b);
    snprintf(m,9,s+3);
    printf("%s\n",m);
    snprintf(n,4,s);
    printf("%s\n",n);
    snprintf(c,6,"%s",s+19);
    printf("%s\n",c);

strcat(d,b);
    printf("%s\n",d);
    strcat(d,m);
    printf("%s\n",d);
    strcat(d,n);
    printf("%s\n",d);
    strcat(d,c);
    printf("%s\n",d);
    getchar();
    return 0;
      }
gcc -o str str.c

./str

结果为:01:10:02 sep  1 wed 2008

其它字符串函数在此:http://vip.6to23.com/tenax/clib/clib.html

名称: sscanf() - 从一个字符串中读进与指定格式相符的数据.

char tmp[50] =  "MACAddress=00:01:02:03:04:05";

char MACAddress[30];
             sscanf(tmp, "MACAddress=%s", MACAddress); //macaddress 为00:01:02:03:04:05
语法: int sscanf( string str, string fmt, mixed var1, mixed var2 ... );

整数 sscanf( 字符串 str, 字符串 fmt, 混合 var1, 混合 var2 ... );

用法: 以指定的格式 fmt 去解读字符串 str. fmt 中除了 %d 和 %s 以外, 亦可包含其他的字符串作为格式. 每一个 %d 或 %s 都对应一个参数, 按顺序为 var1, var2 ... %d 读入一个整数到参数中, 而 %s 读入一个字符串.

* 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)

LPC 的 sscanf() 与 C 的 sscanf() 虽然相似, 但仍有不同之处. LPC 的 sscanf() 不需要 (也不可) 提供变量的内存位址给 sscanf(), 只需要给予变量的名字. 另一个不同点是, LPC 的 sscanf() 对于: sscanf( str, "%s %s", str1, str2 ); 的语法, 将会把 str 中的第一个英文单字 (即第一个空白字符以前的内容) 读入 str1, 后面其余的内容读入 str2.

sscanf() 会返回符合格式的 %d 和 %s 总数.

  sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。
   第一个参数可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}
  注:
  1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)
  2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
  3、width表示读取宽度。
  4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。
  5、type :这就很多了,就是%s,%d之类。
  6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值

  %[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
  %[aB'] 匹配a、B、'中一员,贪婪性
  %[^a] 匹配非a的任意字符,贪婪性

以前曾经编写过这样的小程序:一个文本文件,每行是一条记录,每条记录中包含多个字段,每个字段之间以某种定界符分开,举例如下:

Notebook,IBM,ThinkPad X32,6,12000

(各字段以逗号分隔,内容依次是:物品名称,生产厂家,型号,数量,价格)

如果要对这样的一行记录进行处理,提取出各个字段,怎么做比较好呢?

我以前的做法是在一个循环中用strtok函数每次取一个字段,然后将内容保存到一个字符串数组中。这样做虽然可行,但我总感觉写出的代码有些啰嗦。

最近看到一段代码,用C的标准库函数sscanf,处理这样的数据,只需一行就可以了。我把代码整理了一下,去掉了无关的部分,核心部分如下:

float price;

int quantity;

char category[21], name[21];

char vendor[21], sku[21];

char buf[201];

fp = fopen(filename, "r");

fgets(buf, 200, fp);

sscanf(buf,

"%20[^#]#%20[^#]#%f#%i#%20[^#]#%20[^\n]",

name, sku, &price, &quantity, category, vendor);

下面简单做些解说:

%20[^#]# 最多读入20个字符,直到遇见定界符#,但不包含定界符

%f# 读入一个浮点数,直到遇见定界符#

%i# 读入一个整数,直到遇见定界符#

%20[^\n] 最多读入20个字符,忽略行尾的回车符

是不是很简洁明了呢?

#include <stdio.h>

int main()

{

char log[]="<14>2002-11-11 12:12:12 11.22.33.44 3 3 aaaa aaaaaa";

//char log[]="<1>2002-11-11 12:12:12 11.22.33.44 3 aaaa aaaaaa";

char test[]="<1111> 22";

char log2[200];

char str1[20];

char str2[20];

char str3[20];

char str4[20];

char str5[20];

char str6[20];

char str7[20];

int a1,a2,a3,a4,a5,a6;

sscanf(log,"<%d>%s %s %s %d %d %s",&a1,str2,str3,str4,&a5,&a6,str7);

printf("%d\n",a1);

printf("%s\n",str2);

printf("%s\n",str3);

printf("%s\n",str4);

printf("%d\n",a5);

printf("%d\n",a6);

printf("%s\n",str7);

sscanf(test,"<%d> %d",&a5,&a6);

printf("%d\n",a5);

printf("%d\n",a6);

sscanf(log,"<%[^>]>%[^ ] %[^ ] %[^ ] %[^ ] %[^ ] %[^$]",str1,str2,str3,str4,str5,str6,str7);

printf("%s\n",str1);

printf("%s\n",str2);

printf("%s\n",str3);

printf("%s\n",str4);

printf("%s\n",str5);

printf("%s\n",str6);

printf("%s\n",str7);

return 1;

}

const char *str = "drw-rw-rw- 1 user group 0 Oct 28 2003 -====流行音乐专用FTP=====-";

上面是源串,我要分别得到drw-rw-rw-,group,-====流行音乐专用FTP=====-字段

注意:因为这几个字段的值会变化,所以我要用格式化输入,分别存入下面的a b c中,高手帮忙!

下面这个是我没成功的尝试

char a[20];

char b[50];

char c[20];

int ret = sscanf(str, "%[^' ']* %['u'] %[^' ']"

, a, b, c);

masterz(www.fruitfruit.com) 于 2005-8-6 17:43:49

sscanf可以支持regular expression?或许你要用boost,下面有一个简单的例子,虽然离你的问题还比较远

http://www.fruitfruit.com/vc/boost/boost_regex_test.cpp

newbiestar 于 2005-8-6 18:29:18

楼主一个问题好几个地方问……

int ret = sscanf(str, "%s%*s%*s%s%*s%*s%*s%*s%s", a, b, c);

这样就可以了,不要的东西都抛弃掉了

参见这个帖子里面我的回复

http://community.csdn.net/Expert/topic/4192/4192979.xml?temp=.2922632

ding8125(丁丁) 于 2005-8-6 19:19:12

可以通过字符数组输出一个字符串!~

今天看到一个奇怪的scanf。其实这只是用了正则表达式。

sscanf(user, "%127[^:]:%127[^ ]", user_name, password);

"%127[^:]:%127[^ ]",是正则表达式

用scanf或者printf,可以在%后面跟%d,%s等东西,也可以跟一个正则表达式。

这里,127表示最多可以接受127个字符,[^:]是正则表达式,表示非":",到":"结束

后面,%127[^ ],同样,其中[^ ]是正则表达式,表示非" ",到" "结束

所以,如果user是"wpc:123456"的字符串,那么经过上面的sscanf后,

user_name是wpc,而password是123456

6.

fprintf、fscanf的读写对象不是终端而是磁盘文件;
调用方式为:int   fprintf(文件指针,格式字符串,输出表列 )返回值:返回实际输出的字符数,
操作不成功返回EOF
int fscanf(文件指针,格式字符串,输入表列 )返回值:返回输入的数据个数,操作不成功返回EOF
fprintf(fp, "%d, %6.2f",   i, t)  将整型变量 i 和实型变量 t 的值按%d和%6.2f的格式输出到fp所指向的文件中;  若i=3,t=4.5,则输出到磁盘中的格式为:3,    4.50相应的,从文件中读取数据时,则应用:fscanf(fp, "%d, %f",   &i, &t)

在运用fprintf与fscanf时,在向文件输出数据及从文件读取数据时,分隔符应该相一致。如下程序所示,该程序的功能是:用户输入8个整型数据,程序回显并把数据写到int.txt文件中,然后程序再从int.txt文件中读取数据,并显示出来。
#include <stdio.h>
main()
{
   FILE *fp;
   int i,ss[8],new[8];
   for(i=0;i<8;i++){
     scanf("%d",&ss[i]);
   }
   fp=fopen("int.txt","w");
   printf("start diesplay old data!\n");
   for(i=0;i<8;i++){
      printf("%d:%-10d\n",i+1,ss[i]);
      fprintf(fp,"%d,",ss[i]);  /*输出数据时以逗号为数据之间的分隔符*/
   }
   fclose(fp);
   printf("Now diseplay read date!\n");
    if((fp=fopen("int.txt","r"))==NULL) return 1;
    for(i=0;i<8;i++){
      fscanf(fp,"%d,",&new[i]);  /*输入数据时以逗号为数据之间的分隔符,这样做到前后一致,                                                                                 读取数据不会错*/

printf("%d:%-10d\n",i+1,new[i]);
    }
    fclose(fp);
}

分隔符也可采用\n,即回车符,那么程序中二句相应改为:
fprintf(fp,"%d\n",ss[i]);
fscanf(fp,"%d\n",&new[i]); 

使用fprintf和fscanf的优点:

使用fread和fwrite的优点就是二进制的读取是最快的。但是它们有缺陷,就是在

读取的时候 while(!feof(fp)) 不精确,往往会发现它多循环了一次。因为feof

()是根据剩余字符来判断是否文件结尾的,而文件的结尾标识符是'\0'是两个字

节,在读取'\'的时候feof()还是为false只有读取完'\0'的时候feof()==true。

致使产生多余的循环(如果使用while(!feof(fp))的话)。使用fprintf和fscanf

,因为这两个函数具有输入/输出的格式限制,即使在读取'\0'处有多余的循环,

但由于其不满足输入/输出格式,所以多余的循环被屏蔽掉。

最好就是这样:"%d\t%d\t" 这样的每个数字后面都是有限制的,这样就可以起到

很好的屏蔽作用。^^

对文件的读和写是最常用的文件操作。在C语言中提供了多种文件读写的函数:

·字符读写函数 :fgetc和fputc

·字符串读写函数:fgets和fputs

·数据块读写函数:fread和fwrite

·格式化读写函数:fscanf和fprinf

随着每次数据的读取,文件流指针fp都作相应的移动

使用以上函数都要求包含头文件stdio.h。例子都来自msdn

1.  fprintf——Print formatted data to a stream

#include <stdio.h>
#include <process.h>

FILE *stream;

void main( void )
{
   int     i = 10;
   double fp = 1.5;
   char    s[] = "this is a string";
   char    c = '\n';

stream = fopen( "fprintf.out", "w" );
   fprintf( stream, "%s%c", s, c );
   fprintf( stream, "%d\n", i );
   fprintf( stream, "%f\n", fp );
   fclose( stream );
   system( "type fprintf.out" );
}

Output

this is a string101.500000
2 . fscanf——Read formatted data from a stream
#include <stdio.h>FILE *stream;void main( void ){    long l;    float fp;    char s[81];    char c;    stream = fopen( "fscanf.out", "w+" );    if( stream == NULL )       printf( "The file fscanf.out was not opened\n" );    else    {       fprintf( stream, "%s %ld %f %c", "a-string",                 65000, 3.14159, 'x' );       /* Set pointer to beginning of file: */       fseek( stream, 0L, SEEK_SET );       /* Read data back from file: */       fscanf( stream, "%s", s );       fscanf( stream, "%ld", &l );       fscanf( stream, "%f", &fp );       fscanf( stream, "%c", &c );       /* Output data read: */       printf( "%s\n", s );       printf( "%ld\n", l );       printf( "%f\n", fp );       printf( "%c\n", c );       fclose( stream );    }}Outputa-string650003.141590x3 fread——Reads data from a stream
4.  fwrite——Writes data to a stream
读数据块函数调用的一般形式为: fread(buffer,size,count,fp); 写数据块函数调用的一般形式为: fwrite(buffer,size,count,fp); 其中: buffer 是一个指针,在fread函数中,它表示存放输入数据的首地址。在fwrite函数中,它表示存放输出数据的首地址。 size 表示数据块的字节数。 count 表示要读写的数据块块数。 fp 表示文件指针。
5.  fgets 没有看出与fread太大的区别,除了fread可以处理string外的其他不同文件的数据类型
6.  fputs
7.  fgetc fputs
从键盘输入一行字符,写入一个文件,再把该文件内容读出显示在屏幕上。 #i nclude main() { FILE *fp; char ch; if((fp=fopen("d:\\jrzh\\example\\string","wt+"))==NULL) { printf("Cannot open file strike any key exit!"); getch(); exit(1); } printf("input a string:\n"); ch=getchar(); while (ch!='\n') { fputc(ch,fp); ch=getchar(); } rewind(fp); //Repositions the file pointer to the beginning of a filech=fgetc(fp); while(ch!=EOF) { putchar(ch); ch=fgetc(fp); } printf("\n"); fclose(fp); }

7.

1. read

#include <unistd.h>

ssize_t read(int filedes, void *buf, size_t nbytes);

返回值:读取到的字节数;0(读到 EOF);-1(出错)

read 函数从 filedes 指定的已打开文件中读取 nbytes 字节到 buf 中。以下几种情况会导致读取到的字节数小于 nbytes :

A. 读取普通文件时,读到文件末尾还不够 nbytes 字节。例如:如果文件只有 30 字节,而我们想读取 100 字节,那么实际读到的只有 30 字节,read 函数返回 30 。此时再使用 read 函数作用于这个文件会导致 read 返回 0 。

B. 从终端设备(terminal device)读取时,一般情况下每次只能读取一行。

C. 从网络读取时,网络缓存可能导致读取的字节数小于 nbytes 字节。

D. 读取 pipe 或者 FIFO 时,pipe 或 FIFO 里的字节数可能小于 nbytes 。

E. 从面向记录(record-oriented)的设备读取时,某些面向记录的设备(如磁带)每次最多只能返回一个记录。

F. 在读取了部分数据时被信号中断。

读操作始于 cfo 。在成功返回之前,cfo 增加,增量为实际读取到的字节数。

2. write

#include <unistd.h>

ssize_t write(int filedes, const void *buf, size_t nbytes);

返回值:写入文件的字节数(成功);-1(出错)

write 函数向 filedes 中写入 nbytes 字节数据,数据来源为 buf 。返回值一般总是等于 nbytes,否则就是出错了。常见的出错原因是磁盘空间满了或者超过了文件大小限制。

对于普通文件,写操作始于 cfo 。如果打开文件时使用了 O_APPEND,则每次写操作都将数据写入文件末尾。成功写入后,cfo 增加,增量为实际写入的字节数。

c语言文件操作函数(未完待续)相关推荐

  1. C语言文件操作函数大全(看到总结的真的很好,就转载贡献给大家了)

    C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof 表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * st ...

  2. [C语言]文件操作函数

    [C语言]文件操作函数 ​ 本文主要学习**fopen,fclose,fgetc,fgets,fputc,fputs,fwrite,fread,feof**这几个文件操作函数. ​ 以上函数,需要导入 ...

  3. c语言全文件操作函数,C语言文件操作函数大全

    C语言 文件操作函数大全 C语言文件操作函数 2007-10-17 19:21 13.1C语言文件 1,两种文件存取方式(输入,输出方式) 顺序存取 直接存取 2,数据的两种存放形式 文本文件 二进制 ...

  4. c语言 freopen txt_C语言文件操作函数freopen详解

    C语言文件操作函数freopen详解 今天做USACO 用到了文件的操作. 之前做USACO只是格式化的.些 写 freopen("xxx.in","r",st ...

  5. C语言——文件操作函数 fseek、ftell、rewind详解

    前言 前面,我讲了讲文件操作的第二步:文件的读写操作,里面详细的介绍了各类读写函数的用法,有兴趣的小伙伴可以去看看: C语言--文件操作(2)文件的读写操作_ 接下来,我再来讲一讲关于标题中这三个函数 ...

  6. ios怎么打开c语言文件操作函数,C++ ofstream和ifstream详细用法以及C语言的file用法...

    ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间; 在C++中,有一个stream这个类,所有的I/O都以这个"流"类为基础的,包括我们 ...

  7. C语言文件操作函数总结——超详细

    版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 文件与流 在C语言中有三种标准流: stdin(standard input stream)标 ...

  8. C语言文件操作函数详解

    转载自https://www.cnblogs.com/saolv/p/7793379.html C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现.文件操作标准库 ...

  9. C语言文件操作函数大全

    unix中一切皆文件,所以文件操作至关重要! clearerr(清除文件流的错误旗标) 相关函数 feof 表头文件 #include<stdio.h> 定义函数 void clearer ...

最新文章

  1. Infragistics NetAdvantage 2006 Volume 2 CLR 2.0曲折安装
  2. 计算机书籍-语音识别技术实践
  3. 2008安装完了找不到_7206BEP.进口轴承_玉溪SKF轴承安装指南
  4. java search 不能使用方法_ElasticSearch实战系列三: ElasticSearch的JAVA API使用教程
  5. ubuntu18.04下hadoop安装与集群配置
  6. JavaScript中的this详解
  7. python分支语句中if和else必须同时出现吗_多分支决策必须采用嵌套的if-else语句实现: A、 对 B、 错_学小易找答案...
  8. excel中多条件求和_在Excel中求和的7种方法
  9. 技嘉ide模式怎么改,电脑BIOS中怎么设置硬盘为IDE模式
  10. 10.如何使用 Node.js REPL
  11. 关于运算放大器电流流向的问题
  12. 几何线条科技感员工转正述职报告PPT模板-优页文档
  13. NeuroImage:对情绪表现的快速接近—回避反应反映了基于价值的决策:来自脑电图研究的神经证据
  14. pyqt5 制作壁纸切换工具实例 第一章
  15. win7怎么打开微软更新服务器地址,Win7旗舰版上的windows update服务无法启动
  16. SAP MIGO生产订单入库校验BADI增强MB_MIGO_BADI
  17. ps调色滤镜库:ON1 Effects 2019 mac
  18. 目前最流畅的android手机,买安卓手机请认准这五个最流畅的系统
  19. 关于FACEBOOK 的 REACT 专利许可证
  20. 泰雷兹高科技赋能全球最安全的电子护照之一,泰国公民咸受其益

热门文章

  1. python---(7) Python 关键词
  2. pythonxml读写_python xml读取和写入
  3. 27岁985女硕,运营商工作三年,迷茫想转型
  4. 趣头条,或许是下一个小巨头
  5. 打过工、留过洋、创过业,一位中年IT老兵的反思
  6. Python3.5安装与ChatterBot聊天机器人使用
  7. 从“专用”到“通用” 阿里平头哥野心何在?
  8. IBM 2nm芯片弯道超车了?他连车都没有
  9. 中国联通在香港正式推出5G服务
  10. 在吗,支付宝土味情歌撩到你了吗?网友:撩到了,好酸