没有'\ n'从输入文件打印行的最佳方法?

时间:2015-04-29 05:56:40

标签: c null printf scanf fgets

任务是编写一个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);

}

3 个答案:

答案 0 :(得分:1)

您在此处遇到的问题是fgets()行为。根据手册页,

  

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

因此,它会读取并将跟踪换行符存储到读缓冲区中。那是打印到输出的那个。您可以在获取输入后简单地将\n替换为\0,而不是尝试n_not来打印换行符。

由于这是一个简单的替换操作,如果没有strchr(),您也可以轻松完成工作。

简单Algo:

  1. 使用fgets()
  2. 阅读
  3. 如果返回值不为NULL,请使用strlen()计算输入的长度。
  4. 使用null buffer[strlen-1]替换\n元素(实际为\0,您可以仔细检查)。
  5. 注意: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个字符复制到新目标。