这是我的第一个C班。我需要编写一个程序,将一个文件内容复制到另一个文件中,并在输出文件的第7行后添加一个空行。我写了一个代码,在每行后添加空行,但我只需要一行。拜托,任何人都可以帮忙。这是我到目前为止所得到的:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
void main()
{
FILE *fp1,*fp2;
char ch;
fp1 = fopen("input.txt","r");
if(fp1==NULL)
{
printf("\nThe file was not found.");
exit(1);
}
fp2 = fopen("outfile.txt","w");
if(fp2==NULL)
{
printf("The file was not opened.");
exit(1);
}
while(1)
{
ch = fgetc(fp1);
if (ch=='\n')
putc(ch, fp2);
if(ch==EOF)
break;
else
putc(ch, fp2);
}
printf("File copied succesfully!");
fclose(fp1);
fclose(fp2);
}
答案 0 :(得分:1)
您确定当前正在添加额外的换行符每隔时间找到一个。相反,您需要一种方法来识别仅第7行。听起来像你可以计算换行符,然后只在第七行之后进行额外换行。也许在主函数的顶部添加另一个整数:
int newline_count = 0;
在循环中增加它,并且只在需要时添加换行符:
if (ch == '\n'){
++newline_count; /* increments newline_count by 1 */
if (newline_count == 7){
putc(ch, fp2);
}
}
几点说明:
1)您注意到我的第二个IF语句中有括号在技术上是不必要的。它本质上只是一种风格选择,如果你愿意,你可以将它们关闭,但是如果你仍然应该缩进IF语句所控制的语句,如下所示:
if (newline_count == 7)
putc(ch, fp2);
在您的代码中,您的第三个IF语句与它控制的语句具有相同的缩进。如果缩进第二个语句,它将更具可读性。
2)你的主要功能永远不应该是无效的。你应该至少有这个:
int main(){
/* ... stuff ... */
return (0);
}
请参阅this question的第一个答案,了解有关main()应如何显示的更多信息,更重要的是,为什么。
3)如果您重新排序if语句,我认为您的整个循环看起来会更清晰:
while(1)
{
ch = fgetc(fp1);
if (ch == EOF)
break;
if (ch == '\n'){
++newline_count; /* incremement count of newlines by 1 */
if (newline_count == 7){
putc('\n', fp2); /* insert a newline character */
}
}
putc(ch, fp2);
}
通过重新排序,你已经摆脱了额外的&#34;否则&#34;声明。你并不是真的需要它,因为一旦达到EOF你就会突破循环。此外,通过将putc(ch,fp2)更改为putc(&#39; \ n&#39;,fp2),您可以更清楚地确定您对阅读代码的人的意图。你的目标不仅仅是再次复制同一个角色,而是在那里放一条新线。