Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 避免在输出的最后一行换行_C - Fatal编程技术网

C 避免在输出的最后一行换行

C 避免在输出的最后一行换行,c,C,我想把一些数据逐行写入文件 int main () { char* mystring = "joe"; int i ; FILE * pFile; pFile = fopen ("myfile.txt", "wb"); for(i = 0 ; i < 10 ; i++) { fprintf(pFile,"%s\n",mystring); }

我想把一些数据逐行写入文件

   int main ()
   {
        char* mystring = "joe";
        int i  ;
        FILE * pFile;
        pFile = fopen ("myfile.txt", "wb");
        for(i = 0 ; i <  10 ; i++)
        {
            fprintf(pFile,"%s\n",mystring);
        }
        fclose (pFile);
        return 0;
  }
int main()
{
char*mystring=“joe”;
int i;
文件*pFile;
pFile=fopen(“myfile.txt”、“wb”);
对于(i=0;i<10;i++)
{
fprintf(pFile,“%s\n”,mystring);
}
fclose(pFile);
返回0;
}
我正在使用新行,特别是字符,以便新的数据将进入下一行

问题是最后一行我不想换行

注: 只是为了演示我使用的循环。在实际情况中,我使用链表来迭代数据,因此我不知道长度


请告诉我如何从文件中删除最后一行

一种简单的方法是将字符串的打印和换行符的打印分离为单独的语句,然后将换行符的打印条件化。像这样的东西

for (i = 0; i < 10; i++)
{
    fprintf(pFile, "%s", mystring);
    if (i < 9) // Or whatever condition you need - could be "atEndOfList()" or whatever.
        fprintf (pFile, "\n");
}
(i=0;i<10;i++)的

{
fprintf(pFile,“%s”,mystring);
if(i<9)//或您需要的任何条件-可以是“atEndOfList()”或任何条件。
fprintf(pFile,“\n”);
}

有几个简单的答案:

当你到达列表的末尾时,用一个换行符截断文件

B.打印字符串前的换行符,但仅当不是第一行时:

if (i > 0)
    fputs("\n", pFile);
fputs(mystring, pFile);

注意,这并不依赖于有一个
for
循环;它只要求第一行的
i
仅为0。

我认为这样做很好:

fprintf (pFile, "%s%s", (i > 0 ? "\n" : ""), mystring);

由于您使用的是链表,因此可以检查当前项目是否有下一个项目。如果有,则打印换行,如果没有,则不打印换行,因为它是最后一项。

在下面的代码段中,10可以更改为任何值,而无需修改任何其他测试或ifs

    pFile = fopen ("myfile.txt", "wb");

    fprintf(pFile, "%s", mystring);
    for(i = 1 ; i <  10 ; i++)
    {
        fprintf(pFile, "\n");
        fprintf(pFile, "%s", mystring);
    }
    fclose (pFile);
pFile=fopen(“myfile.txt”、“wb”);
fprintf(pFile,“%s”,mystring);
对于(i=1;i<10;i++)
{
fprintf(pFile,“\n”);
fprintf(pFile,“%s”,mystring);
}
fclose(pFile);

您不知道长度,但必须存在一个条件,当该条件变为false时,程序将停止将字符串放入文件,因此在循环内,写入与循环终止条件相同的if条件。例如,对于您的上述计划,它应该是:

for(i=0;i<10;i++)
{ 
    if((i+1)!<10)    //executed when i=9
    fprintf(pFile,"%s",mystring);
    else             //executed for i=0 to 8
    fprintf(pFile,"%s\n",mystring);
}

用于(i=0;OP表示,在现实生活中,他们不知道列表的长度。因此,他们不能像你建议的那样只检查
i<9
。当然,但会有一些条件。可能是他们在列表的末尾。无论需要什么条件。我只是用他在示例中使用的术语解释。循环正在运行ckward所以你会在结尾处打印一个新行。他们问这个问题的全部原因是,当他们打印一行时,他们还不知道是否有后续行。@Gabe海报上说了什么?我没有看到任何这样说。他们甚至说他们将使用一个链接列表。他们可能不知道列表的长度,但是你仍然知道最后一项,因为它等于“列表的尾部”或者它的“下一个”指针为空,或者类似的东西。截断文件很容易出错,因为在某些操作系统上换行符是两个字节,而在其他操作系统上只有一个字节。@Ian:我想这是因为OP使用的是
“wb”
作为模式,换行符将作为单个字符写入。如果没有循环,则使用计数器有点奇怪。也许表示条件的
bool
是一个更清晰的选择?而且,您的代码永远不会初始化或递增计数器。@user1118321:可以将
i
声明为
bool
,或者甚至使用不同的变量名。无论哪种方式,代码的工作方式都是相同的。@user814064它是前一个字符串后面的换行符。如果在字符串后面打印换行符,则会在文件末尾加一个换行符(前两个字符串将在同一行上).有没有人注意到user2684719现在问了7个问题,从人们那里得到了很多帮助,但他/她却没有接受一个答案?他/她的所有评论如何对花时间试图帮助他的人表示不感谢?…现在提出8个问题:…现在提出9个问题: