c - printf 覆盖,strcat 仅附加文件的第一行
问题描述
我正在完成一项简单的任务:一次从文件中读取一行,打印该行并将所有内容附加到一个 char 数组中。这一切都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
我遇到过多个类似的问题,大多数答案都涉及回车,但我仍然不明白这种行为以及它的原因是什么。
解决方案
该文本文件可能源自以@MM"\r\n"
结尾的平台。
一个简单的解决方案利用了应该"\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"
)将看不到任何行尾。需要一种新的方法。
推荐阅读
- laravel - 如何使用查询生成器计算 Laravel 中的两个相关日期?
- java - java.lang.UnsatisfiedLinkError:java.library.path 中没有“somefile”
- r - 如何从 R 中的文件夹中删除“权限被拒绝”文件
- javascript - 在javascript中按类名获取元素让我发疯
- javascript - 如何将组件挂钩与 Formik handleSubmit 一起使用?
- linux - Ansible 创建用户并将他们分配到基于 vars 的特定组
- apache-kafka-streams - Kafka Stream:应用程序重启时的 Kafka Windowed Stream 行为
- javascript - 调用反应路由器链接时反应引导下拉菜单不会关闭
- google-cloud-platform - 从 GCP 向 Segment.io 发送 HTTP POST 请求
- mongodb - MongoDB $文本搜索未返回预期结果