我正在编写一个程序来保存书籍清单,它从文本文件中读取书籍列表,并将其他书籍写入文件。我得到了它为文件添加新书,但我想在每个书籍条目之间有一个空白行。我怎样才能做到这一点? 其他一些可能有用或需要的信息:我使用的结构将所有标题,作者和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.
如何在每个图书条目之间获得一个空行?
答案 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)
将'\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;
在此处添加一个或两个'\n'
。 @midor
fprintf(input_file,"%s%s%s\n", ...
次要:简化malloc()
。
// current = (struct book *)malloc(sizeof(struct book));
current = malloc(sizeof *current);
检查后续fgets()
的返回值。这里也需要消除尾随\n'
。
在malloc()
考虑初始化整个结构之后。
current = malloc(sizeof *current);
if (current == NULL) Handle_OOM();
memset(current, 0, sizeof *current);
// or
current = calloc(1, sizeof *current);