使用fgetc函数的简单文件复制程序

时间:2016-08-08 04:27:24

标签: c

我制作了一个简单的程序,可以复制源文件并粘贴另一个定义的文件。

以下是我的代码。

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函数复制文件时这是一个严重的问题。

所以我没有理解这种情况发生的原因。

你能帮我理解一下吗?

2 个答案:

答案 0 :(得分:3)

使用类似getchar的函数需要能够返回每个可能的字符加上结束文件指示。

{p>“每个可能的字符”都包含在char类型中,但您必须使用更宽的类型来覆盖“PLUS”位。

换句话说,你的论点“我不认为使用fgetc的字符类型不会(原文如此,假设你打算在这里输入'will')成为一个问题“是错误的。

fgetc()的原型非常明确地指出:int fgetc ( FILE * stream ); 通常用于返回值的内容int。其他任何事情都在惹麻烦(但是,如果您了解隐式转换,您也可以使用更宽或更薄的类型,但int可能是最佳选择。)

而且,顺便说一句,您通常应该检查每次调用的返回值,其中失败可以传播问题(例如gets_sfopen)。并确保传递正确数量和/或类型的参数,一个体面的编译器应该警告你。

答案 1 :(得分:1)

值得注意的是gets_s()有两个参数,char *要读,rsize_t,要读取的最大字符数 - http://en.cppreference.com/w/c/io/gets

但是,我认为问题的根源是类型char不能代表EOF。我建议您为int字符使用char类型而不是ch,因为fgetc()会返回,而intfputc()需要int 1}}作为一个论点。