写入文件时不寻常的字符

时间:2016-12-13 19:47:50

标签: c

我创建了一个包含2个char []和一个int的结构。我创建了一个这个结构的数组,并scanf编了几个输入来将数据存储到数组中。然后我使用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

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

1 个答案:

答案 0 :(得分:4)

您的输入循环是

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

但输出循环是

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

因此,您正在从元素[0]向文件写入数据,而您没有输入数据。这就是为什么它是垃圾。

在C中,数组是从[0]索引的,并且这些循环都不对。请将它们都更改为

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

代码中还存在其他问题,但这解决了直接的&#34;未初始化的数据&#34;问题

编辑:其他一些问题。

您在&#34;二进制&#34;中打开了文件模式,但您将其用作文本文件。我相信这种区别只在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会告诉您扫描的条目数量,public String findWord(String string, String word){ String[] text = string.split(" *"); for(int i=0; i<text.length; i++){ if(text[i].equals(word)){ return text[i]; } } return "Not found"; } 会告诉您它是否也是成功的。