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

打开标题包含int和char变量的文件,c,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];

我想打开一个标题为的文件,例如文件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;
}
我想知道是否有人可以帮我解释这一点,或者他们是否可以指导我到任何地方,我可以得到一些例子,我可以看看


谢谢。

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

两个主要问题是:

扫描%c,&模板

应该是

scanf("  %c", &Template[0]);
sprintf(zahl, "%c", Template[0]);
sprintfname,%c,模板

应该是

scanf("  %c", &Template[0]);
sprintf(zahl, "%c", Template[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;
}

您可以在一条sprintf语句中完成所有这些:

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

考虑到您使用模板的方式,您不应该将其声明为char的1元素数组;表达式的类型&Template和Template将分别为char*[1]和char*,这不是您想要的。将其声明为纯字符。

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

将char Template[1]更改为just char Template,并删除多余的zahl[],用于构造名称的12行代码可以减少为:

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

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

这里使用空格似乎是有意的。但是使用多个空格有什么目的吗?两个与一个具有相同的效果,所以Clifford非常感谢你!这真的很有帮助,而且看起来,我应该学习更多关于编程的知识。