日常需要解析

gcc test001.c
.\a.exe

FILE *fopen(const char *filename, const char *mode)
  • filename -- 这是 C 字符串,包含了要打开的文件名称。
  • mode -- 这是 C 字符串,包含了文件访问模式,模式如下:
  • "r"打开一个用于读取的文件。该文件必须存在。
    "w"创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。
    "a"追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。
    "r+"打开一个用于更新的文件,可读取也可写入。该文件必须存在。
    "w+"创建一个用于读写的空文件。
    "a+"打开一个用于读取和追加的文件。
#include <stdio.h>
#include <stdlib.h>

int main()
{
   FILE * fp;

   fp = fopen ("file.txt", "w+");
   fprintf(fp, "%s %s %s %d", "We", "are", "in", 2014);
   
   fclose(fp);
   
   return(0);
}

让我们编译并运行上面的程序,这将创建一个带有一下内容的文件 file.txt:

We are in 2014

 现在让我们使用下面的程序查看上面文件的内容

#include <stdio.h>

int main ()
{
   FILE *fp;
   int c;
  
   fp = fopen("file.txt","r");
   while(1)
   {
      c = fgetc(fp);
      if( feof(fp) )
      { 
          break ;
      }
      printf("%c", c);
   }
   fclose(fp);
   return(0);
}

函数原型:size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);

(1)buffer:是一个指针,对fwrite来说,是要获取数据的地址;
(2)size:要写入内容的单字节数;
(3)count:要进行写入size字节的数据项的个数;
(4)stream:目标文件指针;
(5)返回实际写入的数据项个数count。
说明:写入到文件的哪里? 这个与文件的打开模式有关,如果是w+,则是从file pointer指向的地址开始写,替换掉之后的内容,文件的长度可以不变,stream的位置移动count个数;如果是a+,则从文件的末尾开始添加,文件长度加大。
fseek对此函数有作用,但是fwrite 函数写到用户空间缓冲区,并未同步到文件中,所以修改后要将内存与文件同步可以用fflush(FILE *fp)函数同步。
注意:返回值随着调用格式的不同而不同:

    (1) 调用格式:fwrite(buf, sizeof(buf), 1, fp);
    成功写入返回值为1(即count)
    (2)调用格式:fwrite(buf, 1, sizeof(buf), fp);
    成功写入则返回实际写入的数据个数(单位为Byte)

注意事项:

    写完数据后要调用fclose()关闭流,不关闭流的情况下,每次读或写数据后,文件指针都会指向下一个待写或者读数据位置的指针。 

static void _disable_tcp_timestamps()
{
    FILE *fp = NULL;

    fp = fopen("/proc/sys/net/ipv4/tcp_timestamps", "w");

    if(fp != NULL)
    {
        if (fwrite("0",1, 1, fp) == 1)    *写入指针,被写入的每个元素大小以字节单位,写入元素个数,  FILE 对象的指针,该 FILE 对象指定了一个输出流。*/
        {
            log_debug("_disable_tcp_timestamps success");  /*成功写入数据返回一个整型数据,如果返回值与三参(nmemb)不同,则会显示一个错误。*/
        {
        }
        else
        {
            log_error("_disable_tcp_timestamps fwrite");
        }
        fclose(fp);   /*写完数据后要调用fclose()关闭流,不关闭流的情况下,每次读或写数据  后,文件指针都会指向下一个待写或者读数据位置的指针。 */
    }
    else
    {
        log_error("_disable_tcp_timestamps fopen");
    }
}

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
参数
ptr -- 这是指向要被写入的元素数组的指针。
size -- 这是要被写入的每个元素的大小,以字节为单位。
nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。
返回值
如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。
实例
下面的实例演示了 fwrite() 函数的用法。

实例
#include<stdio.h>
 
int main ()
{
   FILE *fp;
   char str[] = "This is runoob.com";
 
   fp = fopen( "file.txt" , "w" );
   fwrite(str, sizeof(str) , 1, fp );
 
   fclose(fp);
  
   return(0);
}

让我们编译并运行上面的程序,这将创建一个文件 file.txt,它的内容如下:

This is runoob.com


现在让我们使用下面的程序查看上面文件的内容:

#include <stdio.h>
 
int main ()
{
   FILE *fp;
   int c;
 
   fp = fopen("file.txt","r");
   while(1)
   {
      c = fgetc(fp);
      if( feof(fp) )
      {
          break ;
      }
      printf("%c", c);
   }
   fclose(fp);
   return(0);
}

signal系统信号量 - WittXie - 博客园 (cnblogs.com)

【Linux函数】Signal ()函数详细介绍_华秋实的专栏-CSDN博客_signal

FILE * popen( const char * command,const char * type);

popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。此外,所有使用文件指针(FILE*)操作的函数也都可以使用,除了fclose()以外。

  • 如果 type 为 r,那么调用进程读进 command 的标准输出。
  • 如果 type 为 w,那么调用进程写到 command 的标准输入。

下面的实例演示了 memset() 函数的用法。

实例

#include <stdio.h>
#include <string.h>
 
int main ()
{
   char str[50];
 
   strcpy(str,"This is string.h library function");
   puts(str);
 
   memset(str,'$',7);
   puts(str);
   
   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:

This is string.h library function
$$$$$$$ string.h library function

 C 库函数 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 从给定流 stream 读取数据到 ptr 所指向的数组中。

声明

下面是 fread() 函数的声明。

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

参数

  • ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
  • size -- 这是要读取的每个元素的大小,以字节为单位。
  • nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。

返回值

成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。

实例

#include <stdio.h>
#include <string.h>
 
int main()
{
   FILE *fp;
   char c[] = "This is runoob";
   char buffer[20];
 
   /* 打开文件用于读写 */
   fp = fopen("file.txt", "w+");
 
   /* 写入数据到文件 */
   fwrite(c, strlen(c) + 1, 1, fp);
 
   /* 查找文件的开头 */
   fseek(fp, 0, SEEK_SET);
 
   /* 读取并显示数据 */
   fread(buffer, strlen(c)+1, 1, fp);
   printf("%s\n", buffer);
   fclose(fp);
   
   return(0);
}
让我们编译并运行上面的程序,这将创建一个文件 file.txt,然后写入内容 This is runoob。接下来我们使用 fseek() 函数来重置写指针到文件的开头,文件内容如下所示:

This is runoob
void *memcpy(void *str1, const void *str2, size_t n)
  • str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
  • str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
  • n -- 要被复制的字节数。
  • 该函数返回一个指向目标存储区 str1 的指针。
    // 将字符串复制到数组 dest 中
    #include <stdio.h>
    #include <string.h>
     
    int main ()
    {
       const char src[50] = "http://www.runoob.com";
       char dest[50];
     
       memcpy(dest, src, strlen(src)+1);
       printf("dest = %s\n", dest);
       
       return(0);
    }
    让我们编译并运行上面的程序,这将产生以下结果:
    
    dest = http://www.runoob.com
    
    将 s 中第 11 个字符开始的 6个连续字符复制到 d 中:
    #include <stdio.h>
    #include<string.h>
     
    int main()
     
    {
      char *s="http://www.runoob.com";
      char d[20];
      memcpy(d, s+11, 6);// 从第 11 个字符(r)开始复制,连续复制 6 个字符(runoob)
      // 或者 memcpy(d, s+11*sizeof(char), 6*sizeof(char));
      d[6]='\0';
      printf("%s", d);
      return 0;
    }
    让我们编译并运行上面的程序,这将产生以下结果:
    
    runoob
    
    
    
    覆盖原有部分数据:
    
    实例
    #include<stdio.h>
    #include<string.h>
     
    int main(void)
    {
      char src[] = "***";
      char dest[] = "abcdefg";
      printf("使用 memcpy 前: %s\n", dest);
      memcpy(dest, src, strlen(src));
      printf("使用 memcpy 后: %s\n", dest);
      return 0;
    }
    让我们编译并运行上面的程序,这将产生以下结果:
    
    使用 memcpy 前: abcdefg
    使用 memcpy 后: ***defg
    

    定义说的有点羞涩难懂。举个例子就知道了。 
    比如: 
    char str2 = “cdef”; 
    char str1 = “abcdefgh”; 
    则通过函数,将返回 
    strstr(str1,str2) = cdefgh;

    如果str1不包含有str2。 
    char str2 = “cxef”; 
    char str1 = “abcdefgh”; 
    则通过函数,将返回 
    strstr(str1,str2) = NULL;

fcntl函数的用法总结_rotation博客-CSDN博客_fcntl

fcntl系统调用可以用来对已打开的文件描述符进行各种控制操作以改变已打开文件的的各种属性

函数原型:

1.select()函数
函数select()与之前的recv()和send()直接操作文件描述符不同。使用select()函数可以先对需要操作的文件描述符进行查询,查看是否目标文件描述符可以进行读、写或者错误操作,然后当文件描述符满足操作的条件的时候才进行真正的IO操作。
select()函数原型以及解释说明如下:
 

Linux编程之select - Madcola - 博客园 (cnblogs.com) 

select 机制的优势

为什么会出现select模型?

先看一下下面的这句代码:

int iResult = recv(s, buffer,1024);

这是用来接收数据的,在默认的阻塞模式下的套接字里,recv会阻塞在那里,直到套接字连接上有数据可读,把数据读到buffer里后recv函数才会返回,不然就会一直阻塞在那里。在单线程的程序里出现这种情况会导致主线程(单线程程序里只有一个默认的主线程)被阻塞,这样整个程序被锁死在这里,如果永 远没数据发送过来,那么程序就会被永远锁死。这个问题可以用多线程解决,但是在有多个套接字连接的情况下,这不是一个好的选择,扩展性很差。

     timeout      超时,填NULL为阻塞,填0为非阻塞,其他为一段超时时间

返回值:

       返回fd的总数,错误时返回SOCKET_ERROR

select函数及fd_set介绍 - cs_wu - 博客园 (cnblogs.com) 

这两个结构的区别在于第二个成员:新结构的该成员tv_nsec指定纳秒数,而旧结构的该成员tv_usec指定微秒数。

UNIX网络编程读书笔记:pselect函数 - ITtecman - 博客园 (cnblogs.com) 

memset函数详细说明_VC++/MFC的专栏-CSDN博客_memset函数

memset()的深刻内涵 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值