填写文件ASCII值

时间:2015-04-28 14:21:19

标签: c file-io aio

我想创建一个填充0或其他字母的文件。这是我的功能

int fill(const int d, struct aiocb *aiorp, void *buf, const int count){
        int rv = 0;
        memset( (void *)aiorp, 0, sizeof( struct aiocb ) ); // <-here second paramether is 0
        aiorp->aio_fildes = d;
        aiorp->aio_buf = buf;
        aiorp->aio_nbytes = count;
        aiorp->aio_offset = 0;
        rv = aio_write( aiorp );
        return rv;
}

这是我的主要

int main(int argc, char * argv[]){
        int des;
        int rv;
        struct aiocb aior;
        char buffer[1000];
        if(argc == 3){
                printf("just %s\n", argv[1]);
                des = createFile(argv[1]);
                rv = fill(des, &aior, buffer, sizeof(buffer));
        }
        return 0;
}

所以我的输出应该是文件填充零值,但我的文件充满了垃圾

^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@$
y▒^X^@^@^@^@^@^@^@
s|▒^@^@^@^@^@^@^@^@^@^@^@^@▒r|▒^@^@^@^@▒▒^?▒(▒▒▒▒▒{▒▒
y▒^P^@^@^@▒
y▒^A^@^@^@d^Cy▒^@^@^@^@▒
y▒^T
y▒^P▒▒▒^@^@^@^@^@^@^@^
...

为什么呢?怎么了?

以下是代码:

sukurti - 如果该文件不存在则创建新文件 填充 - 填充创建的文件

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <aio.h>
#define MB 1024

int sukurti(char *name);
int fill(const int d, struct aiocb *aiorp, void *buf, const int count);

int sukurti(char *name){
   int dskr;
   dskr = open( name, O_RDONLY );
   if( dskr == -1 ){
          printf("Failas sukurtas, nes jo nebuvo\n");
          dskr = open( name, O_WRONLY | O_CREAT, 0644);

   }else{
           printf("Jau yra toks failas!\n");
           exit(1);
   }
   return dskr;
}

int fill(const int d, struct aiocb *aiorp, void *buf, const int count){
        int rv = 0;
        memset( (void *)aiorp, 'A', sizeof( struct aiocb ) );
        aiorp->aio_fildes = d;
        aiorp->aio_buf = buf;
        aiorp->aio_nbytes = count;
        aiorp->aio_offset = 0;
        rv = aio_write( aiorp );
        return rv;

}

int main(int argc, char * argv[]){
        int des;
        int rv;
        struct aiocb aior;
        int x = atoi(argv[2]);
        printf("%d\n", x);
        int size = MB * MB * x;
        char buffer[size];
        if(argc == 3){
                printf("just %s\n", argv[1]);
                des = sukurti(argv[1]);
                rv = fill(des, &aior, buffer, sizeof(buffer));
        }else{
                printf("Blogas\n");
        }
        return 0;
}

编辑: 我知道我的文件结束了

2 个答案:

答案 0 :(得分:5)

这里有三个问题:

  1. buffer未被初始化。使用

    执行此操作
    memset(buffer, 
      <what ever 8bit value you want the file to be filled with>, 
      sizeof buffer);
    

    main()中定义后。

  2. aior错误地初始化。使用

    将其初始化为所有0
    memset(aiorb, 0, sizeof aior);
    

    main()中定义后立即删除memset()中对fill()的调用。

  3. 最后,程序很可能在之前结束缓冲区异步写入磁盘。

    要解决此问题,请定义man 7 aio下提到的通知方法。并让程序等待在结束程序之前收到此通知。

    例如,可以通过信号询问完成通知并等待此信号来完成。

    为此,请按以下步骤修改代码:

    • 将以下两行添加到aiorpfill()所指向的初始化中:

      aiorp->aio_sigevent.sigev_notify = SIGEV_SIGNAL;
      aiorp->aio_sigevent.sigev_signo = SIGUSR1;
      
    • 为了能够处理发送的通知信号(不结束程序),需要设置信号处理程序:

      void handler(int sig)
      {
        /* Do nothing. */
      }
      
    • 通过调用

      安装此处理程序
      signal(handler, SIGUSR1);
      

      就在课程开始时。

    • return来自main()来电wait_for_completion(SIGUSR1)之前void wait_for_completion(int sig) { sigset_t set; sigemptyset(&set); sigaddset(&set, sig); sigwait(&set, &sig); /* This blocks until sig had been received by the program. */ printf("Completion notification for asynchronous 'write'-operation received.\n"); } 可能如下:

      DECLARE @empID NVARCHAR(50)
      DECLARE @projectID NVARCHAR(50)
      
      SELECT @empid = Emp_id from EMPLOYEE WHERE Emp_id = '123461'
      SELECT @ProjectID = PROJECT_ID from PROJECTS where PROJECT_ID  = 'P300'
      
      IF (@empid is not null and @ProjectID is not null)
      BEGIN
         INSERT INTO PALLOCATION (Emp_id, Project_id, Staff_cost) 
         VALUES (@empid,@ProjectID,'800')
      END
      

    根据需要添加错误处理。为了便于阅读,我把它留了出来。

答案 1 :(得分:4)

  memset( (void *)aiorp, '0', sizeof( struct aiocb ) );

0不是'0',您需要实际使用ASCII值(如果我没记错的话,则为48)。