好的,这是令人尴尬的,尽管我讨厌,但我别无选择。我不知道C,但我遇到了一个我需要解决的问题,虽然我已经做了一些研究,但是我需要自己修改程序的时间太多,所以我不得不吞下自己的骄傲(和我猜一些代表要求帮助。
这是一个将unix文件转换为dos的简单程序,唯一的问题是我需要它来接受通配符(例如.. c:/&gt; unix2dos * .txt或file * .txt)没什么特别的。< / p>
这是我现在的代码..
// UNIX2DOS - a Win32 utility to convert single text files from Unix to MS-DOS format.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/utime.h>
#ifndef TRUE
# define TRUE (1)
# define FALSE (0)
#endif
#define R_CNTRL "rb"
#define W_CNTRL "wb"
struct stat s_buf;
int u2dos (path)
char *path;
{
FILE *in, *out;
int ch,
prev_ch= 0,
rval = FALSE;
char temppath [16];
struct _utimbuf ut_buf;
strcpy (temppath, "./clntmp");
strcat (temppath, "XXXXXX");
mktemp (temppath);
if ((in=fopen (path, R_CNTRL)) == (FILE *) 0)
return TRUE;
if ((out=fopen (temppath, W_CNTRL)) == (FILE *) 0)
{
fclose (in);
return TRUE;
}
#define LF 0x0A
#define CR 0x0D
while ((ch = getc (in)) != EOF)
{
if ( ( ch == LF)
&& ( prev_ch != CR)
&& ( putc( CR, out) == EOF)
|| ( putc( ch, out) == EOF)
)
{
rval = TRUE;
break;
}
prev_ch= ch ;
}
if (fclose (in) == EOF)
{
rval = TRUE;
}
if (fclose (out) == EOF)
{
rval = TRUE;
}
ut_buf.actime = s_buf.st_atime;
ut_buf.modtime = s_buf.st_mtime;
if (_utime (temppath, &ut_buf) == -1)
rval = TRUE;
if (unlink (path) == -1)
rval = TRUE;
if (rval)
{
unlink (temppath);
return TRUE;
}
if (rename (temppath,path) == -1)
{
fprintf (stderr, "Unix2Dos: Problems renaming '%s' to '%s'.\n", temppath, path);
fprintf (stderr, " However, file '%s' remains.\n", temppath);
exit (1);
}
unlink (temppath);
return FALSE;
}
void main (argc, argv)
int argc;
char **argv;
{
char *path;
while (--argc>0)
{
if (stat (path=*++argv, &s_buf) != -1)
{
printf ("Unix2Dos: Processing file %s ...\n", path);
if (u2dos (path))
{
fprintf (stderr, "Unix2Dos: Problems processing file %s.\n", path);
exit (1);
}
}
else
{
fprintf (stderr, "Unix2Dos: Can't stat '%s'.\n", path);
exit (1);
}
}
}
我不敢相信我已经偏离了一个“发送给我代码”的人,我已经开始鄙视了,但现在看来这似乎是我最好的选择。
我现在要把头埋在沙子里。谢谢你的时间。
编辑
虽然暗示,我认为我应该明白这个问题。在Windows环境中修改此程序以接受通配符变量可以提供一些帮助吗?
答案 0 :(得分:4)
* nix shells(例如bash)会自动扩展通配符参数。 Windows shell没有。但Microsoft Visual C运行时库确实可以选择在程序启动时自动执行此操作。如何做到解释here。基本上你需要链接到setargv.obj。
答案 1 :(得分:4)
由于这将在Windows上运行,因此您可以使用FindFirstFile,FindNextFile和FindClose。这里有一个例子:http://msdn.microsoft.com/en-us/library/aa364418(VS.85).aspx
答案 2 :(得分:3)
你必须重新发明一大堆轮子才能在文件名中使用通配符,甚至可以更多地使用通配符。尝试使用cygwin的bash
和unix2dos
。
答案 3 :(得分:0)
为什么不按原样运行程序,让一些(。)bat(ch)文件魔法扩展通配符?
关于如何执行此操作,请参阅此处:http://support.microsoft.com/kb/68268/en-us
虽然你要为每个要转换的文件开始一个新的过程,这是一个非常昂贵的,但它会让你无法使用你似乎不喜欢的语言进行黑客攻击......; - )