从文件中读取文本但显示不正确

时间:2017-10-29 13:58:09

标签: c file-io

我正在使用C从文件中读取文本并将其存储在struct数组中。 但是在我使用printf打印之后,它的输出并不是我所期望的。

我的代码:

#include<stdio.h>
struct userINFO {
    char id[6];
    char name[20];
    char lastName[20];
};
int main()
{
    FILE *fdata;
    struct userINFO allUser[3];
    int i=0;
    fdata = fopen("textdata.txt","r");

    if (fdata == NULL)
    {
        printf("ERROR!");
        return 0;
    }

    while (fscanf(fdata,"%s %s %s", allUser[i].id, allUser[i].name, allUser[i].lastName)!=EOF)
    {
        i++;
    }

    for (i = 0; i < 3 ; i++)
    {
        printf("ID: %s\n", allUser[i].id);
        printf("Name: %s\n", allUser[i].name);
        printf("LastName: %s\n", allUser[i].lastName);
    }
    fclose(fdata);

    return 0;
}

文字档案:

001001
Firstname1
LastName1
601002
Firstname2
LastName2
601003
Firstname3
LastName3

输出

ID: 001001Firstname1
Name: Firstname1
LastName: LastName1
ID: 601002Firstname2
Name: Firstname2
LastName: LastName2
ID: 601003Firstname3
Name: Firstname3
LastName: LastName3

应该是什么:

ID: 001001
Name: Firstname1
LastName: LastName1
ID: 601002
Name: Firstname2
LastName: LastName2
ID: 601003
Name: Firstname3
LastName: LastName3

我尝试过很多改变fscanf的事情 - &gt; fgets,在printf中添加%6s,更改文本格式等。但它的输出仍然相同。 我应该在代码中更改什么才能使其正确显示?

2 个答案:

答案 0 :(得分:1)

在结构中,您使用的是长度为6的字符串,但您需要考虑&#39; \ 0&#39;字符。因此,将id长度设为7将解决您的问题

final SyncAdapterType[] syncs = ContentResolver.getSyncAdapterTypes();
for (SyncAdapterType sync : syncs) {
    Log.d(TAG, "found SyncAdapter: " + sync.accountType);
    if (ContactsContract.AUTHORITY.equals(sync.authority)) {
        Log.d(TAG, "SyncAdapter supports contacts: " + sync.accountType + " - supportsUploading=" + sync.supportsUploading());
    }
}

答案 1 :(得分:0)

简单。变化:

struct userINFO {
    char id[6];
    char name[20];
    char lastName[20];
};

struct userINFO {
    char id[7];
    char name[20];
    char lastName[20];
};

在C中,\0需要一个额外的字符来表示字符串的结尾。

C非常低级,因此printf不知道为字符串保留了多少内存。 printf唯一知道的就是它开始的地方。然后继续阅读,直至达到\0。如果它在数组外部读取,则会导致未定义的行为