如何控制格式化程序的输出?

时间:2015-02-19 04:33:49

标签: c output string-formatting

我正在运行以下代码,以获取从3个不同.txt文件中获取数据的程序。当我尝试按列发布值时,似乎无法控制我的数据发布的行。

#include <stdio.h>
#include <string.h>
int
main (void)
{
FILE *data_File;
FILE *lake_File;
FILE *beach_File;

char fileName[10], lake_Table[15],beach_Table[15];  /*.txt file names */
int lake_data=0,lake_x=0, beach_x=0, nr_tests=0;    /* variables for the data within the file july08.txt */

int province_data=0,prv_x=0;        /* variables for the file Lake Table.txt */

int beach_data=0,bch_x=0;           /* variables for the file Beach Table.txt*/

char province[30] = ""; /*variable for the file Lake Table.txt*/
char beach[20]="";   /*variable for the file Beach Table.txt*/

int j;
double status, ecoli_lvl;

printf ("Which month would you like a summary of? \nType month followed by date (i.e: july05): ");
gets(fileName);

/*Opening the files needed for the program*/
data_File = fopen (fileName, "r");
lake_File = fopen ("Lake Table.txt", "r");
beach_File = fopen ("Beach Table.txt", "r");

/*These are my columns*/
printf ("\n  Lake           Beach          Average E-Coli Level     Recommendation\n");


/* july08.txt file*/
fscanf (data_File, "%d", &lake_x);
fscanf (data_File, "%d", &beach_x);
lake_data = fscanf (data_File, "%d", &nr_tests);

/* Lake Table.txt file*/
province_data = fscanf (lake_File, "%d", &prv_x);
fgets (province,30,lake_File);

/* Beach Table.txt file*/
beach_data = fscanf (beach_File, "%d", &bch_x);
fgets (beach,20,beach_File);

status = (double) 0;

while (province_data > 0)
{
    if (lake_x == prv_x)
    {
        province_data = 0;

        while (beach_data > 0)
        {
            if (beach_x == bch_x)
            {
                beach_data = 0;
            }    
            else
            {
                beach_data = fscanf (beach_File, "%d", &bch_x);
                fgets (beach,30,beach_File);
            }
        }    
    }    
    else
    {
        province_data = fscanf (lake_File, "%d", &prv_x);
        fgets (province,30,lake_File);
    }

这是我的问题发生的地方。我希望下面两个变量打印在各自列下的同一行上。我已经编辑了我需要的空间,但由于某种原因,第二个变量是海滩&#39;在第二行发布。注意:通过&#39;海滩的条件声明的数据&#39;变量位于第二个文件的第二行。这就是为什么它被贴在第二排?如何控制我的数据发布到哪一行?

printf ("%s     %s", province, beach);

}    

更新声明的条件(使用strlen方法)

while (lake_data != EOF)
{

        while (province_data > 0)
    {
        if (lake_x == prv_x)
        {

            province_data = 0;

            while (beach_data > 0)
            {
                if (beach_x == bch_x)
                {                    
                    beach_data = 0;
                }    
                else
                {
                    beach_data = fscanf (beach_File, "%d", &bch_x);
                    fgets (beach,30,beach_File);
                }
            }    

        }    
        else
        {
            province_data = fscanf (lake_File, "%d", &prv_x);
            fgets (province,30,lake_File);
        }
        if (province[strlen(province)-1] =='\n')
        {
            province[strlen(province)-1] ='\0';
            beach[strlen(beach)-1] ='\0';
        }        


        /*code was right here*/


    }            

    for (j=1; j<=nr_tests; ++j)
    {
        fscanf (data_File, "%lf", &ecoli_lvl);
        status = status + ecoli_lvl;
    }


    printf ("%s      %s       %.2f", province, beach, status);    

    /* printf ("             %.2f", status); */

    /* Lake Table.txt file*/
    province_data = fscanf (lake_File, "%d", &prv_x);
    fgets (province,30,lake_File);

    /* Beach Table.txt file*/
    beach_data = fscanf (beach_File, "%d", &bch_x);
    fgets (beach,20,beach_File);

    fscanf (data_File, "\n%d", &lake_x);
    fscanf (data_File, "%d", &beach_x);
    lake_data = fscanf (data_File, "\n%d", &nr_tests);
    printf ("\n");
    status = (double) 0;
}


fclose (data_File);

return (0);

} 这是我的输出:我在&#34;&#34;中使用了tab命令。试图调整我的文字,但你可以看到它不是很有效。我怎样才能解决这个问题? enter image description here

1 个答案:

答案 0 :(得分:4)

您正在从fgets获取输入,它获取包含换行符的行, 之后,它将空值。

当您打印放置在该字符串中的province换行符时。所以第二个变量打印在下一行。

 if ( province[strlen(province)-1] == '\n' )
        province[strlen(province)-1] = '\0';            

测试,因为它在读取文件的最后一行时可能有EOF个字符。

来自fgets的手册页,

  

在EOF或换行符后停止阅读。如果读取换行符,则将其存储到          缓冲。终止空字节(&#39; \ 0&#39;)存储在缓冲区中的最后一个字符之后。

请参阅此link了解strlen()。它是一个简单的函数,用于获取放置在给定字符串中的总字符数,包括空字符。它只适用于字符串。

像这样你必须使用。

if (province[strlen(province)-1] == '\n')
 {
    province[strlen(province)-1] = '\0';
    beach[strlen(beach)-1] = '\0';
 }

 printf ("%s     %s", province, beach);
}   

格式:

打印scanf时,您可以使用-。用于打印正确的空间。

  printf("test:%-10s\n","Testing");

它将给出尾随空格。在这种情况下,测试是七个字符,因此有三个尾随空格。