2015-12-04 77 views
-1

我想打開一個帶有標題的文件,例如「文件10-9B-g06.dat」,其中「B」和「文件」對所有文件都重複,但其餘文件是可變的。標題中出現「g」時,問題就開始了。我用「g」變量作爲一個字符串,但它沒有工作。打開包含int和char變量的標題的文件

#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; 
} 

我想知道是否有人可以幫我解釋一下,或者如果他們能指引我到任何地方我可以看一些例子,我可以通過。

謝謝。

回答

0

第一個問題似乎是您在閱讀變量Template時在scanf中使用空格。 看到提示這裏:C scanf with spaces problem

+0

這裏使用空格似乎是故意的。 – Joni

+0

但是有沒有使用多個的目的? –

+0

兩個有同樣的效果,所以沒有 – Joni

0

的兩個主要問題是這些:

的scanf( 「%C」,&模板);

應該是

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

的sprintf(姓名, 「%C」,模板);

應該

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

你可以做的一切,在一個單一的sprintf聲明:

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

考慮如何你正在使用Template,你不應該聲明它作爲char的1元素數組;表達式&TemplateTemplate的類型將分別爲char (*)[1]char *,這不是您想要的。改爲將其聲明爲普通的char

3

代碼中有許多格式說明符和數據類型的問題,但除此之外,效率非常低且不必要的複雜。

改變char Template[1]只是char Template,併除去多餘的zahl[],12線你有用於構建name可以減少到僅有:

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

一個與C字符串的問題是,它們不包含長度信息,所以函數strcat()必須從搜索nul終止符開始迭代;在這裏您正在使用strcat()反覆使用日益增長的字符串。在這個短的字符串結構中,因此可能並不重要,但在某些情況下它可能變成prohibitively slow。除此之外,更多的代碼行僅僅意味着更多的代碼來維護和調試。這裏整個格式在一行代碼中描述,因此維護時更容易看到應該構建的是什麼。

+0

非常感謝你克利福!這真的很有幫助,看來,我應該學習更多關於編程的知識。 – Soran