为什么C语言的程序赢得了';你不能在Windows上工作吗?
我有一个用C语言编写的Linux程序,它在Linux平台上运行良好,但在Windows下不工作。它使用代码块(mingw32 gcc)在Windows中成功编译,但它没有按预期工作,它只是抛出一个错误并终止程序。如何使其在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 <
#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