2016-12-13 39 views
-3

我用2个char []和一个int创建了一个struct。我创建了一个这个结构体的数组,并将几个输入数据存储到数组中。然后我用fprintf将这些数据写入文件。但是当我打开文件时,我在每个新记录之前得到û。 Idk为什么会这样。写入文件时出现不寻常的字符

下面是相关代码:

FILE *outputFile=fopen("1021.txt","ab"); 
int tickets=0,i=1; 
struct air s[30]; 
printf("\nEnter Number of tickets:"); 
scanf("%d",&tickets); 
for (i=1;i<=tickets;i++) 
{ 
    printf("\nEnter the name\t"); 
    scanf("%s",&s[i].name); 
    printf("\nEnter the phone number\t"); 
    scanf("%s",&s[i].phoneNo); 
    printf("\n Enter the address\t"); 

    scanf("%s",&s[i].address); 
    printf("Your ticket is confirmed\t"); 
    getch(); 
} 
for (i=0;i<=tickets;i++) 
{ 
    printf("%s", s[i].name); 
    printf("%s", s[i].phoneNo); 
    printf("%s", s[i].address); 
    fprintf(outputFile,"%s",s[i].name); 
    fprintf(outputFile,"%s",s[i].phoneNo); 
    fprintf(outputFile,"%s",s[i].address); 
} 

这里就是我得到的文件中: ûdalla03332228458dallaÈfsÇûÿÿÿÿàrancho03312041265dallabancho

哪里都来自那些不寻常的角色?

+3

[MCVE](http://stackoverflow.com/help/mcve)所需的,什么是'结构air'? –

+3

为什么混合二进制文件和文本文件I/O? –

+1

在C数组索引中,基于'0'。更改'为(i = 1; I <=门票;我++)'来'为(i = 0; I <门票;我++)' –

回答

4

你输入回路

for (i=1;i<=tickets;i++) 

但输出回路是从元素[0]文件,您有没有输入的数据

for (i=0;i<=tickets;i++) 

所以你正在写数据。这就是为什么它是垃圾。

在C中,数组的索引从[0]开始,并且这两个循环都不正确。请他们都改变

for (i = 0; i < tickets; i++) 

有代码过于其他的问题,但这种解决眼前的“未初始化的数据”的问题。

编辑:一些其他问题。

您以“二进制”模式打开文件,但您将其用作文本文件。我相信这个区别只在Windows中是必需的。

FILE *outputFile=fopen("1021.txt", "at"); // change to "t" 

传递给scanf的字符串地址不应该包含一个&地址的(不像int)。只需传递数组 - 它会衰减到所需的指针。

scanf("%s", s[i].name);      // removed `&` 

由于您没有任何书面向换行符文件到您的丹麦字符串数据,当你回到读取数据,你不会知道每一个地方结束和下一个开始。因此,例如,添加newline这样

fprintf(outputFile, "%s\n", s[i].name);  // added \n 

你说一个成员是int大概的电话号码,但你输入一个字符串。然而,将电话号码存储为整数是个不错的主意,因为a)可能包含一个字符,如'+'或b)可能以前导0开头,当您存储为int时,该字符将会丢失。因此,将结构成员phoneNo更改为足够长度的char阵列。

scanf格式说明%s将停止在满足第一空白,所以输入的语句将作为这更好的,这当它找到一个newline或击中长度的限制,只会停止:

int res = scanf("%29[^\n]", s[i].name); 

其中定义的数组长度为[30](您没有显示结构)。或者你可以研究使用fgets()

最后,你应该检查你正在打电话,看看他们是成功的函数的返回值。 fopen会告诉你文件是否打开正确。 scanf会告诉你它扫描条目数,并fgets告诉你,如果它成功了。