关于功能:如何防止在从C保存的文件末尾出现多余的空格?

How to prevent the appearance of an extra white space at the end of a file that was saved from C?

我有这个功能,它在文本文件中保存每个学生的朋友。 学生的名字保存在不同的文本文件中,并且该代码的工作正常,所以我没有包含它。 但是,当我查看我的friends.txt时,我注意到文件末端下方有一个额外的"空白区域"。 我该如何删除?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void save(student *h, student *t){
FILE *fp1;
student *y = h->next;
fp1 = fopen("friends.txt","w");
    while(y != t){
        friend *y1 = y->friendh->next;
        if(y1 != y->friendt){
                while(y1 != y->friendt->prev){
                    fprintf(fp1,"%s", y1->friends);
                    y1 = y1->next;
                }
                if(y1 == y->friendt->prev){
                    fprintf(fp1,"%s
"
, y1->friends);
                }
        }
        y = y->next;
    }
fclose(fp1);

}

你看到的空间可能是最后一行末尾的换行符。

如果你想将换行视为行或终结符之间的分隔符(所以最后一行也应该有换行符),这一切都归结为一切。 IMO最常用的换行符是终结符,甚至还有文本编辑器会在找不到时添加这样的换行符。

例如,一个有效的C源文件应该以换行符终止,即使这意味着在某些编辑器中它看起来像是在末尾有一个空行。

如果您不希望换行符成为终结符,您可以稍微更改代码,以便在最后添加换行符而不是在第一行之外的每行上添加换行符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void save(student *h, student *t){
    int first = 1;
    FILE *fp1;
    student *y = h->next;
    fp1 = fopen("friends.txt","w");
    while(y != t){
        friend *y1 = y->friendh->next;
        if (!first) fputc('
'
, fp1);   /* Start on a new line */
        if(y1 != y->friendt){
                while(y1 != y->friendt->prev){
                    fprintf(fp1,"%s", y1->friends);
                    y1 = y1->next;
                }
                if(y1 == y->friendt->prev){
                    fprintf(fp1,"%s", y1->friends);
                }
        }
        y = y->next;
        first = 0;
    }
    fclose(fp1);
}