如何在文本文件中写入空行?

时间:2014-12-05 20:28:03

标签: c file-io newline

我正在编写一个程序来保存书籍清单,它从文本文件中读取书籍列表,并将其他书籍写入文件。我得到了它为文件添加新书,但我想在每个书籍条目之间有一个空白行。我怎样才能做到这一点? 其他一些可能有用或需要的信息:我使用的结构将所有标题,作者和ISBN都保存在字符串中。

以下是收集新数据的部分: 它被放入一个链表。

puts("Enter first book title.");
while(fgets(input, 80, stdin) != NULL && input[0] != '\n')
{
current = (struct book *)malloc(sizeof(struct book));
if(head == NULL)
   head = current;
else
   prev->next = current;
current->next = NULL;

strcpy(current->title, input);
puts("Enter the author.");
fgets(current->author, 80, stdin);
puts("Enter the ISBN.");
fgets(current->ISBN, 80, stdin);

puts("Enter next book title (empty line to quit)");
prev = current;
}

这是写入文件的部分:

input_file = fopen("library.txt", "w"); 
printf("Printing list to file...\n");
while(current != NULL)
{
  fprintf(input_file,"%s%s%s", current->title, current->author, current->ISBN);
  //fputs(newline, input_file);    
}

这是相关部分。我尝试过的评论部分,但它全部放了换行符,弄乱了已经很好格式化的数据。 这是文本文件应该如何显示的一个小例子(忽略着色):

Title 1
Last, First
000000 (ISBN)

Title 2
Last, First
111111

etc.

当我添加一本书并且程序将其写入文件时,它会像这样添加它(为了清楚起见,省略了ISBN):

...
Title 2
Last, First
First Added Book
Last, First
Second Added Title
Last, First
etc.

如何在每个图书条目之间获得一个空行?

2 个答案:

答案 0 :(得分:1)

为什么不在此行中插入换行符(\ n)?

fprintf(input_file,"%s%s%s", current->title, current->author, current->ISBN);

- >

fprintf(input_file,"%s%s%s\n", current->title, current->author, current->ISBN);

仅供参考,如果你添加更多\ n,你会得到更多空行。

答案 1 :(得分:0)

  1. '\n'留在input。 (见#4)
    此代码希望使用已删除其终止'\n'的输入。 @Lee Daniel Crocker

    while(fgets(input, 80, stdin) != NULL) {
    
      size_t len = strlen(input);
      // Note: under select circumstances, len will be 0.
      if (len > 0 && input[i-1] == '\n') input[--len] = 0;
    
      // replace `&& input[0] != '\n'` with 
      if (len == 0) break;
    
  2. 在此处添加一个或两个'\n'@midor

    fprintf(input_file,"%s%s%s\n", ...
    
  3. 次要:简化malloc()

    // current = (struct book *)malloc(sizeof(struct book));
    current = malloc(sizeof *current);
    
  4. 检查后续fgets()的返回值。这里也需要消除尾随\n'

  5. malloc()考虑初始化整个结构之后。

    current = malloc(sizeof *current);
    if (current == NULL) Handle_OOM(); 
    memset(current, 0, sizeof *current);
    
    // or 
    
    current = calloc(1, sizeof *current);