【问题标题】:The best way to print lines from an inputfile without '\n'? [duplicate]从没有'\ n'的输入文件中打印行的最佳方法? [复制]
【发布时间】:2015-04-29 05:56:40
【问题描述】:

任务是编写一个 c 程序来打印从输入文件读取的行(可能非常非常大),但没有 '\n'。请看下面代码中的注释,是典型的方式还是好的方式??

int main() {
const char *input_wavlist_file = "/home/legend0011/Downloads/test-sample-list.txt";

const int BUFFER_SIZE = 100;

FILE *fr = fopen(input_wavlist_file, "r");

if (fr == NULL) {
    printf("Error opening input wav list file!\n");
    exit(1);
}

char str[BUFFER_SIZE];
while((fgets(str, BUFFER_SIZE, fr)) != NULL) {
    char *pch = strchr(str, '\n');

    char *filepath = str;
    if (pch != NULL) *pch = '\0';  // is this a typical way????????
    printf("reading==>%s",filepath);
}

fclose(fr);

}

【问题讨论】:

  • 你没有写入文件.. 你到底想做什么?看起来您正在尝试从文件中读取。所以你的意思是在不读取\n 的情况下读取文件
  • @Gopi 我们都误解了.. OP 想从文件打印到标准输出.. :-)
  • 只需在 shell 中打印。或者您可以将其写入 txt 文件。两个都很好!!
  • 我只是想问一下用 c 风格写 string substring = source.substr(0, len) 的正确方法是什么
  • @SouravGhosh 是的,问题标题误导了我们

标签: c null printf scanf fgets


【解决方案1】:

fgets() 带有换行符,将换行符抑制并打印出来。

size_t n = strlen(str);

if(n>0 && str[n-1] == '\n')
{
  str[n-1] = '\0';
}

printf("%s",str);

【讨论】:

    【解决方案2】:

    您在这里面临的问题是 fgets() 行为。根据手册页,

    fgets() 从流中最多读入一个小于 size 的字符,并将它们存储到 s 指向的缓冲区中。在EOFnewline 之后停止读取。如果读取了newline,则将其存储到缓冲区中......

    因此,它会读取换行符并将其存储到读取缓冲区中。那是打印到输出的那个。无需尝试 n_not 打印_换行符,您只需在输入后将尾随 \n 替换为 \0 即可解决您的问题。

    由于这是一个简单的替换操作,无需strchr()也可以轻松完成工作。

    简单算法:

    1. 使用fgets()阅读
    2. 如果返回值不为 NULL,则使用 strlen() 计算输入的长度。
    3. buffer[strlen-1]元素(实际上是\n,您可以仔细检查)替换为空\0

    注意:main() 的正确签名是 int main(void)

    【讨论】:

    • 我给出了实际代码..:)
    • @Gopi 恕我直言,你不应该有。不要喂养他们,向他们展示事情的方法,这样你实际上是在帮助他们。 :-)
    • 显示代码以提供帮助是我认为我们一直在做的事情:)
    • @Gopi 没问题,你提供了代码,我试着把算法。有了这两个答案,所有的方法都被涵盖了。干杯!!!
    【解决方案3】:

    这回答了您评论中的问题。 c 中没有字符串赋值运算符。您必须为这个新字符串提供一些空间或破坏性地修改原始字符串。

    实现您想要的最简单的方法是使用 strncpy 将源字符串的前 n 个字符复制到新目标。

    【讨论】:

      猜你喜欢
      • 2011-01-03
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 2020-04-05
      • 1970-01-01
      相关资源
      最近更新 更多