我制作了一个简单的程序,可以复制源文件并粘贴另一个定义的文件。
以下是我的代码。
if (Request.QueryString["ProcessName"].ToString().Equals("Ebill"))
{
using (SqlCommand cmd = new SqlCommand("AR_Ebill_claim", con))
{
cmd.CommandType = CommandType.StoredProcedure;
string compcode = null;
DateTime dateFrom = DateTime.Now;
DateTime dateTo = DateTime.Now;
string episType = null;
string debtorCode = null;
if (Request.QueryString["compcode"] != null)
{
if (string.IsNullOrEmpty(Convert.ToString(Request.QueryString["compcode"])))
{
compcode = null;
}
else
{
compcode = Convert.ToString(Request.QueryString["compcode"]);
}
}
if (Request.QueryString["dateFrom"] != null)
{
DateTime dtFrom = DateTime.Parse(Request.QueryString["dateFrom"]);
dtFrom.ToString("dd-MMM-yyyy");
if (dtFrom == null)
{
dateFrom = DateTime.Now;
}
else
{
dateFrom = dtFrom;
}
}
if (Request.QueryString["dateTo"] != null)
{
DateTime dtTo = DateTime.Parse(Request.QueryString["dateTo"]);
dtTo.ToString("dd-MMM-yyyy");
if (dtTo == null)
{
dateTo = DateTime.Now;
}
else
{
dateTo = dtTo;
}
}
if (Request.QueryString["episType"] != null)
{
if (string.IsNullOrEmpty(Convert.ToString(Request.QueryString["episType"])))
{
episType = null;
}
else
{
episType = Convert.ToString(Request.QueryString["episType"]);
}
}
if (Request.QueryString["debtorCode"] != null)
{
if (string.IsNullOrEmpty(Convert.ToString(Request.QueryString["debtorCode"])))
{
debtorCode = null;
}
else
{
debtorCode = Convert.ToString(Request.QueryString["debtorCode"]);
}
}
cmd.Parameters.Add("@compcode", SqlDbType.VarChar, 100);
cmd.Parameters["@compcode"].Value = compcode;
cmd.Parameters.Add("@dateFrom", SqlDbType.SmallDateTime);
cmd.Parameters["@dateFrom"].Value = dateFrom;
cmd.Parameters.Add("@dateTo", SqlDbType.SmallDateTime);
cmd.Parameters["@dateTo"].Value = dateTo;
cmd.Parameters.Add("@episType", SqlDbType.VarChar, 40);
cmd.Parameters["@episType"].Value = episType;
cmd.Parameters.Add("@debtorCode", SqlDbType.VarChar, 100);
cmd.Parameters["@debtorCode"].Value = debtorCode;
con.Open();
//cmd.ExecuteNonQuery();
//gdBill.EmptyDataText = "No Records Found";
//gdBill.DataSource = cmd.ExecuteReader();
//gdBill.DataBind();
string outputFilePath = Server.MapPath("~/Documents/EClaim.txt");
if (File.Exists("~/Documents/EClaim.txt"))
{
File.Delete("~/Documents/EClaim.txt");
}
SqlDataAdapter da = new SqlDataAdapter();
DataTable dt = new DataTable();
da.SelectCommand = cmd;
da.Fill(dt);
int[] maxLengths = new int[dt.Columns.Count];
for (int i = 0; i < dt.Columns.Count; i++)
{
maxLengths[i] = dt.Columns[i].ColumnName.Length;
foreach (DataRow row in dt.Rows)
{
if (!row.IsNull(i))
{
int length = row[i].ToString().Length;
if (length > maxLengths[i])
{
maxLengths[i] = length;
}
}
}
}
using (StreamWriter sw = new StreamWriter(outputFilePath, false))
{
//for (int i = 0; i < dt.Columns.Count; i++)
//{
// sw.Write(dt.Columns[i].ColumnName.PadRight(maxLengths[i] + 2));
//}
sw.WriteLine();
foreach (DataRow row in dt.Rows)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
if (!row.IsNull(i))
{
sw.Write(row[i].ToString().PadRight(maxLengths[i] + 1));
}
else
{
sw.Write(new string(' ', maxLengths[i] + 1));
}
}
sw.WriteLine();
}
sw.Close();
}
//string filePath = "~/Documents/EBilling.txt";
//Response.ContentType = "application/text";
//Response.AddHeader("Content-Disposition", "attachment;filename=\"" + filePath + "\"");
//Response.TransmitFile(Server.MapPath(filePath));
////Response.End();
}
当我使用fgetc函数时,它返回整数类型的值,因为EOF需要4个字节的空间。我知道这个概念,但是,当我制作这个程序时,我使用了字符类型来错误地存储返回值。然后,我运行了这个程序,目标文件(我要复制的文件)无法正确创建。 (文件大小为0字节)因此我将字符类型更改为整数类型,然后我发现它工作正常。
正如我上面提到的,我知道fgetc返回整数类型的值。但是,我不认为使用fgetc的字符类型不会成为问题,但在使用fgetc函数复制文件时这是一个严重的问题。
所以我没有理解这种情况发生的原因。
你能帮我理解一下吗?
答案 0 :(得分:3)
使用类似getchar
的函数需要能够返回每个可能的字符加上结束文件指示。
char
类型中,但您必须使用更宽的类型来覆盖“PLUS”位。
换句话说,你的论点“我不认为使用fgetc
的字符类型不会(原文如此,假设你打算在这里输入'will')成为一个问题“是错误的。
fgetc()
的原型非常明确地指出:int fgetc ( FILE * stream );
和 通常用于返回值的内容int
。其他任何事情都在惹麻烦(但是,如果您了解隐式转换,您也可以使用更宽或更薄的类型,但int
可能是最佳选择。)
而且,顺便说一句,您通常应该检查每次调用的返回值,其中失败可以传播问题(例如gets_s
或fopen
)。并确保传递正确数量和/或类型的参数,一个体面的编译器应该警告你。
答案 1 :(得分:1)
值得注意的是gets_s()
有两个参数,char *
要读,rsize_t
,要读取的最大字符数 - http://en.cppreference.com/w/c/io/gets
但是,我认为问题的根源是类型char
不能代表EOF
。我建议您为int
字符使用char
类型而不是ch
,因为fgetc()
会返回,而int
和fputc()
需要int
1}}作为一个论点。