C 从单个源文件创建多个文件

C 从单个源文件创建多个文件,c,C,我目前正在学习C语言,并试图解决一个问题。我有一个文本文件名elements.txt,其中包含以下内容: elements.txt Carbon (from Latin: carbo "coal") is a chemical element .. Oxygen is a chemical element with symbol O .. Platinum is a chemical element with symbol Pt ... Silicon is a chemical ele

我目前正在学习C语言,并试图解决一个问题。我有一个文本文件名
elements.txt
,其中包含以下内容:

elements.txt

Carbon (from Latin: carbo "coal") is a chemical element  ..

Oxygen is a chemical element with symbol O ..

Platinum is a chemical element with symbol Pt ...

Silicon is a chemical element with symbol Si ...

Titanium is a chemical element with symbol Ti ...
我想基于元素创建多个文件,例如
carbon.txt
oxygen.txt
platinum.txt
silicon.txt
tianium.txt
来自
elements.txt

这是我的源代码:

  void magic(){
  FILE *fp,*fp1, *fp2, *fp3, *fp4, *fp5;
  char *fn, *fn1, *fn2, *fn3, *fn4, *fn5;
  int ch;

  fn1 = "new/carbon.txt";
  fn2 = "new/oxygen.txt";
  fn3 = "new/platinum.txt";
  fn4 = "new/silicon.txt";
  fn5 = "new/titanium.txt";

  fn = "elements.txt";

  // Read file
  fp = fopen(fn ,"r");
  if(fp == NULL){
    printf("Error opening %s for reading. Program terminated",fn);
  }

  // Write file
  fp1 = fopen(fn1, "w");
  fp2 = fopen(fn2, "w");
  fp3 = fopen(fn3, "w");
  fp4 = fopen(fn4, "w");
  fp5 = fopen(fn5, "w");

  if(fp1 == NULL || fp2 == NULL || fp3 == NULL || fp4 == NULL || fp5 == NULL){
    printf("Error opening %s for wrting. Program terminated",fn);
  }

  while( (ch= fgetc(fp)) != '\n')
    fputc(ch, fp1);

  while( (ch= fgetc(fp)) != '\n')
    fputc(ch, fp2);

  while( (ch= fgetc(fp)) != '\n')
    fputc(ch, fp3);

  while( (ch= fgetc(fp)) != '\n')
    fputc(ch, fp4);

  while( (ch= fgetc(fp)) != EOF)
    fputc(ch, fp5);

  printf("All files were created successfuly!.\n");
    fclose(fp1);
    fclose(fp2);
    fclose(fp3);
    fclose(fp4);
    fclose(fp5);
    fclose(fp);
}



  int main(){
    magic();
    return 0;
  }
我确实创建了我的文件,但氧气用铂和铂打印,硅和钛用钛打印。当我在读这个角色时,好像有一个错误。不确定如何解决此问题。是否有方法使用for循环读取和写入多个文件


任何帮助都将不胜感激!谢谢

在您的
.txt
输入文件中,不同元素的内容由两个换行符分隔,而不是一个。尝试重写它:

Carbon is... 
Oxygen is... 
等等(段落末尾没有额外的换行符)

或者,您可以检查是否存在2个换行符而不是1个换行符,但这将更加复杂


(说明:该程序将有关碳的内容写入
fn1
,然后看到一个换行符并切换到
fn2
,然后看到另一个换行符并切换到
fn3
。同样的事情发生在氧气段落的末尾)

.txt
输入文件中,不同元素的内容由两个换行符分隔,而不是一个。尝试重写它:

Carbon is... 
Oxygen is... 
等等(段落末尾没有额外的换行符)

或者,您可以检查是否存在2个换行符而不是1个换行符,但这将更加复杂


(说明:该程序将有关碳的内容写入
fn1
,然后看到一个换行符并切换到
fn2
,然后看到另一个换行符并切换到
fn3
。同样的事情发生在氧气段落的末尾)

如注释所示,为了使此块正确,您应该添加
return
语句:

 if(fp1 == NULL || fp2 == NULL || fp3 == NULL || fp4 == NULL || fp5 == NULL){
    printf("Error opening %s for wrting. Program leaving",fn);
    return; //add this statement to leave function
  }
否则,程序终止的语句将是谎言


如果希望代码处理只有空格的行的输入文件(而不是修改输入文件),请在将该行放入输出文件之前,为只有空格的行添加测试。使用
fgets()
strstr()
strlen()
将适合创建这样的测试

如注释所示,为了使此块正确,您应该添加
return
语句:

 if(fp1 == NULL || fp2 == NULL || fp3 == NULL || fp4 == NULL || fp5 == NULL){
    printf("Error opening %s for wrting. Program leaving",fn);
    return; //add this statement to leave function
  }
否则,程序终止的语句将是谎言


如果希望代码处理只有空格的行的输入文件(而不是修改输入文件),请在将该行放入输出文件之前,为只有空格的行添加测试。使用
fgets()
strstr()
strlen()
将适合创建这样的测试

程序终止,正确处理输入中的空行,程序终止,正确处理输入中的空行,更合适的是<代码>退出(1)< /代码>或类似的内容。指示操作系统的非零退出代码。@hyst329-
return
允许从调用函数执行其他操作。在本例中,
main()
将在下一步退出,但情况并非总是如此。或者将
magic()
的类型更改为
int
,然后
返回1
void
返回类型在这里不是很好,因为它没有向
main()
@hyst329-同意-好的建议提供任何信息。你应该把它加到你的答案中。:)更合适的方法是
exit(1)
或类似的方法,以指示操作系统的非零退出代码。@hyst329-
return
允许从调用函数执行其他操作。在本例中,
main()
将在下一步退出,但情况并非总是如此。或者将
magic()
的类型更改为
int
,然后
返回1
void
返回类型在这里不是很好,因为它没有向
main()
@hyst329-同意-好的建议提供任何信息。你应该把它加到你的答案中。:)