打开包含int和char变量的标题的文件

时间:2015-12-04 09:57:06

标签: c

我想打开一个带有标题的文件,例如"文件10-9B-g06.dat"在哪里" B"和"文件"对所有文件重复,但其余文件都是可变的。当我有" g"在标题中。我使用了" g"变量作为字符串,但它也不起作用。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
 int CaseSize, Type, Counter;
 char name[100], zahl[20], char Template[1];

FILE *stream;

scanf("%d", &CaseSize );
scanf("%d", &Type );
scanf("  %c", &Template );
scanf("%d", &Counter );

strcpy(name, "File ");
sprintf(zahl, "%d", CaseSize);
strcat(name, zahl);
strcat(name, "-");
sprintf(zahl, "%d", Type);
strcat(name, zahl);
strcat(name, "B-");
sprintf(name, "%c", Template);
strcat(name, zahl);

sprintf(zahl, "%2d", Counter);
strcat(name, zahl);
strcat(name, ".dat");
stream=fopen(name, "a");

fclose(stream);
return 0;
}

我想知道是否有人可以帮我解释一下,或者他们是否可以指引我到任何地方,我可以得到一些我可以看的例子。

感谢。

5 个答案:

答案 0 :(得分:3)

代码在格式说明符和数据类型方面存在许多问题,但除此之外非常低效且不必要地复杂。

char Template[1]更改为char Template,并删除多余的zahl[],您构建name的12行可以简化为:

sprintf( name, "%s %d-%dB-%c%02d.dat", "File", CaseSize, Type, Template, Counter ) ;

C字符串的一个问题是它们不包含长度信息,因此诸如strcat()之类的函数必须从头开始搜索nul终止符;在这里,您在越来越长的字符串上反复使用strcat()。在这种短的字符串结构中,因此可能并不重要,但在某些情况下它可能变为prohibitively slow。除此之外,更多的代码行意味着需要更多代码来维护和调试。在这里,整个格式在一行代码中描述,因此维护起来更容易看出应该构造什么。

答案 1 :(得分:0)

第一个问题似乎是您在读取变量模板时在scanf中使用空格。 请参阅此处的提示:C scanf with spaces problem

答案 2 :(得分:0)

这两个主要问题是:

  

scanf(“%c”,&amp; Template);

应该是

scanf("  %c", &Template[0]);
  

sprintf(名称,“%c”,模板);

应该是

sprintf(zahl, "%c", Template[0]);

答案 3 :(得分:0)

进行了一些测试,这有效:

int main()
{
  int CaseSize, Type, Counter;
  char name[100];
  char zahl[20];
  char Template;

  FILE *stream;

  scanf("%d", &CaseSize);
  scanf("%d", &Type);
  scanf(" %c", &Template);
  scanf("%2d", &Counter);

  strcpy(name, "File ");
  sprintf(zahl, "%d", CaseSize);
  strcat(name, zahl);
  strcat(name, "-");
  sprintf(zahl, "%d", Type);
  strcat(name, zahl);
  strcat(name, "B-");
  sprintf(zahl, "%c", Template);
  strcat(name, zahl);

  sprintf(zahl, "%02d", Counter);
  strcat(name, zahl);
  strcat(name, ".dat");
  printf("%s\n", name);
  stream=fopen(name, "a");
  fclose(stream);
  return 0;
}

答案 4 :(得分:0)

您可以在一个sprintf语句中执行所有操作:

sprintf( name, "File %d-%dB-%c%02d.dat", CaseSize, Type, Template, Counter );

鉴于你如何使用Template,你不应该将它声明为char的1元素数组;表达式&TemplateTemplate的类型将分别为char (*)[1]char *,这不是您想要的。将其声明为普通char