为什么C语言的程序赢得了';你不能在Windows上工作吗?

为什么C语言的程序赢得了';你不能在Windows上工作吗?,c,linux,windows,C,Linux,Windows,我有一个用C语言编写的Linux程序,它在Linux平台上运行良好,但在Windows下不工作。它使用代码块(mingw32 gcc)在Windows中成功编译,但它没有按预期工作,它只是抛出一个错误并终止程序。如何使其在Windows上工作,请帮助。代码如下: #include <sys/types.h> #include <unistd.h> #include <fcntl.h> #include <assert.h> #include <

我有一个用C语言编写的Linux程序,它在Linux平台上运行良好,但在Windows下不工作。它使用代码块(mingw32 gcc)在Windows中成功编译,但它没有按预期工作,它只是抛出一个错误并终止程序。如何使其在Windows上工作,请帮助。代码如下:

#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int i, size, k = 2, ftab, sect = 3;

    char buf[512];
    char vbuf;
    int dev, fil_descr, off=0;

    fil_descr = open(argv[2], O_RDONLY);
    assert(fil_descr > 0);
    read(fil_descr, buf, 512);
    close(fil_descr);

    printf("Bootsector file: %s\n" ,argv[2]);

    dev=open(argv[1], O_RDWR);
    assert(dev > 0);
    write(dev, buf, 512);

    ftab = open("filetable", O_CREAT|O_RDWR);
    sprintf(buf, "{");
    write(ftab, buf, 1);

    for(i = 3; i < argc; i++)
    {   
        off = off + (k * 512);
        lseek(dev, off, SEEK_SET);
        fil_descr=open(argv[i], O_RDONLY);
        assert(fil_descr > 0);
        size = 0;       

        while((read(fil_descr, &vbuf, 1))!=0) 
        {
            size++;
            write(dev, &vbuf, 1);

        }

        k = (size > 512)?2:1;

        sprintf(buf, "%s-%d," ,argv[i], sect);
        write(ftab, buf, strlen(buf));
        printf("Input file \'%s\' written at offset %d\n", argv[i], off);
        close(fil_descr);

        sect = sect + k;
    }

    sprintf(buf,"}");
    write(ftab, buf, 1);

    lseek(ftab, 0, SEEK_SET);
    read(ftab, buf, 512);

    lseek(dev, 512, SEEK_SET);
    write(dev, buf, 512);   
    close (dev);
    close(ftab);    
}
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int i,尺寸,k=2,ftab,截面=3;
char-buf[512];
char-vbuf;
int dev,fil_descr,off=0;
fil_descr=打开(argv[2],仅限O_rdo);
断言(fil_descr>0);
读取(文件描述,buf,512);
关闭(fil_descr);
printf(“引导扇区文件:%s\n”,argv[2]);
dev=打开(argv[1],O_RDWR);
断言(dev>0);
写(dev,buf,512);
ftab=打开(“文件表”,O|u创建| O|u RDWR);
sprintf(buf,“{”);
写入(ftab、buf、1);
对于(i=3;i0);
尺寸=0;
while((读取(fil_descr,&vbuf,1))!=0)
{
大小++;
编写(dev和vbuf,1);
}
k=(大小>512)?2:1;
sprintf(buf,“%s-%d”,argv[i],sect);
编写(ftab、buf、strlen(buf));
printf(“在偏移量%d\n处写入的输入文件\'%s\”,argv[i],关闭);
关闭(fil_descr);
sect=sect+k;
}
sprintf(buf,“}”);
写入(ftab、buf、1);
lseek(ftab,0,SEEK_集);
读取(ftab、buf、512);
lseek(dev,512,SEEK_SET);
写(dev,buf,512);
关闭(开发);
关闭(ftab);
}

这两个标题都是特定于linux的

#include <sys/types.h>
#include <unistd.h>
#包括
#包括

这两个标题都是特定于linux的

#include <sys/types.h>
#include <unistd.h>
#包括
#包括

这两个标题都是特定于linux的

#include <sys/types.h>
#include <unistd.h>
#包括
#包括

这两个标题都是特定于linux的

#include <sys/types.h>
#include <unistd.h>
#包括
#包括

为了调试这样的问题,您应该添加一些代码行来帮助调试

我将程序的各个部分更改为

printf("Bootsector file: %s\n" ,argv[2]);
fil_descr = open(argv[2], O_RDONLY);
if (fil_descr < 0) {
    perror("open");
}

printf("fil_descr: %d\n", fil_descr);
assert(fil_descr > 0);
printf(“引导扇区文件:%s\n”,argv[2]);
fil_descr=打开(argv[2],仅限O_rdo);
如果(fil_descr<0){
佩罗(“公开”);
}
printf(“文件描述:%d\n”,文件描述);
断言(fil_descr>0);
并意识到第二个命令行参数必须是要读取的文件的文件名

如果我正确指定它,它就可以正常工作


第一个文件正在写入,其余的参数也是要读取的文件名。

为了调试这样的问题,您应该添加一些代码行来帮助您这样做

我将程序的各个部分更改为

printf("Bootsector file: %s\n" ,argv[2]);
fil_descr = open(argv[2], O_RDONLY);
if (fil_descr < 0) {
    perror("open");
}

printf("fil_descr: %d\n", fil_descr);
assert(fil_descr > 0);
printf(“引导扇区文件:%s\n”,argv[2]);
fil_descr=打开(argv[2],仅限O_rdo);
如果(fil_descr<0){
佩罗(“公开”);
}
printf(“文件描述:%d\n”,文件描述);
断言(fil_descr>0);
并意识到第二个命令行参数必须是要读取的文件的文件名

如果我正确指定它,它就可以正常工作


第一个文件正在写入,其余的参数也是要读取的文件名。

为了调试这样的问题,您应该添加一些代码行来帮助您这样做

我将程序的各个部分更改为

printf("Bootsector file: %s\n" ,argv[2]);
fil_descr = open(argv[2], O_RDONLY);
if (fil_descr < 0) {
    perror("open");
}

printf("fil_descr: %d\n", fil_descr);
assert(fil_descr > 0);
printf(“引导扇区文件:%s\n”,argv[2]);
fil_descr=打开(argv[2],仅限O_rdo);
如果(fil_descr<0){
佩罗(“公开”);
}
printf(“文件描述:%d\n”,文件描述);
断言(fil_descr>0);
并意识到第二个命令行参数必须是要读取的文件的文件名

如果我正确指定它,它就可以正常工作


第一个文件正在写入,其余的参数也是要读取的文件名。

为了调试这样的问题,您应该添加一些代码行来帮助您这样做

我将程序的各个部分更改为

printf("Bootsector file: %s\n" ,argv[2]);
fil_descr = open(argv[2], O_RDONLY);
if (fil_descr < 0) {
    perror("open");
}

printf("fil_descr: %d\n", fil_descr);
assert(fil_descr > 0);
printf(“引导扇区文件:%s\n”,argv[2]);
fil_descr=打开(argv[2],仅限O_rdo);
如果(fil_descr<0){
佩罗(“公开”);
}
printf(“文件描述:%d\n”,文件描述);
断言(fil_descr>0);
并意识到第二个命令行参数必须是要读取的文件的文件名

如果我正确指定它,它就可以正常工作


第一个文件正在写入,其余的参数也是要读取的文件名。

这不是一个不在Windows下工作的C程序(尽管C是使用的编程语言)

不可行的是,尝试使用针对Win32的编译器,使用POSIX API函数(如
open
read
write
)编译程序。这包括使用几个在此环境中不存在的头(如果它们存在,将声明系统上不存在的函数)

您必须使用Unix兼容层(Microsoft曾经销售该层,但不确定它们是否仍然可以使用,Cygwin可能也可以使用),或者使用适当的C,或者使用本机Win32 API函数


也就是说,如果切换到使用C标准库I/O函数或本机Win32函数,它也可能无法按预期方式工作。输出“
bootssector:
”表明您正在尝试的东西在系统驱动器上根本不起作用,只能在另一个磁盘上使用管理权限。

这不是一个不在Windows下工作的C程序(尽管C是使用的编程语言)

不可行的是,尝试使用针对Win32的编译器,使用POSIX API函数(如
open
read
write
)编译程序。这包括使用几个在此环境中不存在的头(如果它们存在,将声明系统上不存在的函数)

您必须使用Uni