任务是编写一个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);
}
答案 0 :(得分:1)
您在此处遇到的问题是fgets()
行为。根据手册页,
fgets()
从流中读取最多一个小于大小的字符,并将它们存储到s指向的缓冲区中。在EOF
或newline
之后,阅读会停止。如果读取newline
,则将其存储到缓冲区....
因此,它会读取并将跟踪换行符存储到读缓冲区中。那是打印到输出的那个。您可以在获取输入后简单地将\n
替换为\0
,而不是尝试n_not来打印换行符。
由于这是一个简单的替换操作,如果没有strchr()
,您也可以轻松完成工作。
简单Algo:
fgets()
strlen()
计算输入的长度。buffer[strlen-1]
替换\n
元素(实际为\0
,您可以仔细检查)。注意:main()
的正确签名是int main(void)
答案 1 :(得分:1)
fgets()
带有换行符,可以压缩换行并打印出来。
size_t n = strlen(str);
if(n>0 && str[n-1] == '\n')
{
str[n-1] = '\0';
}
printf("%s",str);
答案 2 :(得分:0)
这回答了你评论中的问题。 c中没有字符串赋值运算符。你必须为这个新字符串提供一些空间,或者破坏性地修改原始字符串。
实现所需内容的最简单方法是使用strncpy将源字符串的前n个字符复制到新目标。