c - printf 覆盖,strcat 仅附加文件的第一行

标签 c file printf stdout

我正在执行一项简单的任务:一次从文件 中读取一行,打印该行并将所有内容附加到一个字符数组中。这一切都始于我项目中的一个Segmentation fault (core dumped),然后我继续隔离我的代码,直到我遇到这个:

#include <stdio.h>
#include <string.h>
int main(void)
{
    FILE *fp;
    fp = fopen("read.txt","r");
    char buffer[255];
    char longBuff[1024] = "";
    while(fgets(buffer, 255, fp)) {
        printf("%s\n",buffer);
        strcat(longBuff, buffer);
    }
    fclose(fp);
    printf("WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWTF%s\n", longBuff);
}

read.txt 文件:

short
this is Longer
+++++
sad

和输出:

sad++is Longer
sad++is LongerWWWWWWWWWWWWWWWWWWWTFshort

当我满怀信心地期待时:

short
this is Longer
+++++
sad
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWTFshortthis is Longer+++++sad

我已经回答了多个类似的问题,大多数答案都引用了 carriage return但我仍然不明白这种行为及其原因。

最佳答案

文本文件可能源自具有 "\r\n" 行结尾的平台 @M.M .

一个简单的解决方案利用了应该出现的 "\r" ,它占据了行尾的大部分并且很容易被删除。 strcspn()

我现在看到 @David C. Rankin建议这个。

while(fgets(buffer, sizeof buffer, fp)) {
  // Find length of string not made up of '\n', '\r', '\0'
  // This nicely lops off the line ending, be it "\n", "\r\n" or missing.
  buffer[strcspn(buffer, "\n\r")] = '\0';
  printf("<%s>\n",buffer);
}

不幸的是,当文本文件行尾仅使用 "\r" 时,fgets()(在需要 "\n" 的系统上>) 将看不到任何行结尾。需要一种新方法。

关于c - printf 覆盖,strcat 仅附加文件的第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54084577/

相关文章:

c++ - 确定重定向套接字打开请求的预期 IP 的 POSIX 调用是什么?

python - 如何一次读取并附加到文本文件?

c - C中奇怪的printf输出

file - Emacs Lisp 中是否有相当于 Python 的 __file__ 的东西

c - 但是当使用 %d 而不是 %p 时,到底打印了什么?

c - 模仿printf

c++ - calloc 覆盖另一个变量的内存?

c - 如何检查给定参数是否是另一个给定参数的子字符串

c - 使用 char 和 float 读取\写入二进制文件

javascript - 可以通过浏览器上传文件到github页面吗?