所以我有一个文本文件,其中包含频道名称,格式为:
General
Private
Programming
Calculus
我尝试做的是用户是否写了“#' / channel'在控制台上程序应该以这种格式打印所有通道:
Channels are : General, Private, Programming, Calculus
我的问题是以这种格式打印频道,用逗号分隔它们。根据我现在的情况,我可以打印频道,但是它们以文本文件中的格式打印(每行一个频道名称)。如果有人可以向我解释一下这样做的最佳方式是我会非常感激。以下是我目前打印频道的代码:
void get_channels() {
char tmp[50];
FILE *f;
f = fopen("../1part/channels.txt", "r");
if (f == NULL) { perror("Mistake reading: "); exit(1); } ;
while (fgets(tmp, sizeof(tmp), f)) {
printf("%s", tmp);
}
fclose(f);
}
答案 0 :(得分:3)
您应该从fgets()
读取的行中删除尾部换行符。
void get_channels(void) {
char tmp[50];
FILE *f;
const char *separator = "";
f = fopen("../1part/channels.txt", "r");
if (f == NULL) {
perror("Mistake reading: ");
exit(1);
}
printf("Channels are: ");
while (fgets(tmp, sizeof(tmp), f)) {
/* strip the newline character if present */
tmp[strcspn(tmp, "\n")] = '\0';
printf("%s%s", separator, tmp);
separator = ", ";
}
printf("\n");
fclose(f);
}
注意:
tmp
也不会以换行符结束。剥离最后一个字符也是不正确的,但上面的代码仍然错误地处理了这种情况,因为这样的行将被分成2个项目。使缓冲区更大是一个简单的解决方案。separator
字符串,将其初始化为空字符串,并在每个项目是一个简单的方法之后将其更改为", "
,以生成没有额外测试的连接列表。答案 1 :(得分:1)
我的问题是以这种格式打印频道,用逗号分隔它们。
您可能希望从\n
移除fgets
- 这样您就可以在一行中printf
多个项目:
while (fgets(tmp, sizeof(tmp), f))
{
tmp[strlen(tmp) - 1] = '\0'; // remove \n
printf("%s, ", tmp);
}