在 c++ 中使用 fprintf 时如何删除行尾的尾随空格

How to remove the trailing space at the end of a line when using fprintf in c++

提问人:user27665 提问时间:10/20/2022 更新时间:10/21/2022 访问量:256

问:

我正在尝试在不使用换行符的情况下写入一组从 1 到 640(固定宽度 = 8)的整数。当我滚动每一行(以 row1 为例)时,行尾还剩一个空格(固定宽度 = 8),如图所示。当游标从一个整数的开头移动到下一个整数的开头时,列值将递增 8。

我需要光标在该行中的最后一个整数(即第一行中的 16)被交叉后立即跳转到下一行(即没有图像中的额外空间)。我还需要列值在下一行的开头仍应递增 8。也就是说,整数 16 之前的列值应该是 15X8+1=121,整数 16 之后应该是 15X8+3=123,然后光标应该跳到下一行,显示列值 16X8 + 1=129。

我的代码在图像下方。(光标的列值显示在 gedit 或其他文本编辑器的右下角)enter image description here

#include <iostream>     // std::cout, std::endl
#include <iomanip>      // std::setw
#include <stdio.h>
#include <stdlib.h>

int main () {
    
   FILE * fp;    
   fp = fopen ("file.txt", "w+");

   int n=640;
   for(int i = 1; i <= n; i++)
   {
      fprintf(fp, "%-8d", i);
   }

   fclose(fp);

   return 0;
}
C++ Printf 空格 IOMarip

评论

0赞 j6t 10/20/2022
您不能在刚刚打印空格时“删除”空格。看来你必须特别对待最后一列的打印。
1赞 Pepijn Kramer 10/20/2022
为什么首先在C++中使用FILE和fprintf。这些是与“C”向后兼容后遗留下来的东西。使用 std::ifstream,如果您有 C++20,请使用 std::format 进行字符串格式设置。(您包含的带有 C++ 库的 .h 的任何头文件都是我认为的 C 遗留文件)
1赞 Pepijn Kramer 10/20/2022
您还可以在循环中除第一次迭代之外的所有迭代中“预置”空格。所以:这样你就不会在最后添加空格。if (i>1) print a space
0赞 Sebastian 10/20/2022
仅打印最后一列。介绍空间。根据您的程序,您打印的是具有 640 列的一行。前面空格的换行符实际上可能是由于您的查看者造成的。您可以在两者之间引入换行符。为什么不显示?你有条件%d-8\n640<= nn = 640
0赞 Sebastian 10/20/2022
列索引是查看者确定的内容。如果您有换行符,它通常应该再次以 1 开头。如果没有换行符,则通常需要尽可能多的字符来递增列号。查看者决定是否分隔长行以及是否在行尾显示空格(但大多数/所有查看者,即分隔过长的行并显示列号)。如果要配置查看器,它需要一个可编程接口,否则它与 Stackoverflow 无关。修改文件可能无法获得所需的所有内容。

答:

0赞 BingShan Wang 10/20/2022 #1

这很简单,你需要添加一个法官。

#include <iostream>     // std::cout, std::endl
#include <iomanip>      // std::setw
#include <stdio.h>
#include <stdlib.h>

int main () {
    
   FILE * fp;    
   fp = fopen ("file.txt", "w+");

   int n=640;
   for(int i = 1; i <= n; i++)
   {
      fprintf(fp, "%d ", i);  //fix printf
      if(i % 8 == 0){       //add a if judge
          fprintf(fp,"\n");   
      }
   }

   fclose(fp);

   return 0;
}

评论

0赞 j6t 10/20/2022
数字之间没有任何空格......
0赞 BingShan Wang 10/21/2022
呵呵,这是一个错误。你很好!
0赞 j6t 10/21/2022
但是现在您在换行符之前确实有一个空白。这难道不是OP最初的问题吗?
0赞 Sebastian 10/21/2022
问题在于 OP 希望将每个数据列的文本文件列值递增 8(因此每列必须有 8 个字符的宽度),并且在显式或隐式换行符之后,列号不应再次从 1 开始。
0赞 BingShan Wang 1/18/2023
@Sebastian这个开始 1 意味着每 8 秒是一行。(1 <= 640) , 640 / 8 = 80 .这是对的兄弟,为什么应该从 1 开始??因为 “ 0%8 ==0 ” 这个东西会抓住一个错误,即一行将 fprintf 一个 '\n'