gpt4 book ai didi

c - 读取c中制表符分隔的文件

转载 作者:太空宇宙 更新时间:2023-11-04 00:04:35 24 4
gpt4 key购买 nike

我真的是 C 的新手,读取文件的事情让我发疯......我想读取一个文件,包括姓名、出生地和电话号码等,全部用制表符分隔

格式可能是这样的:

Bob Jason   Los Angeles    33333333
Alice Wong Washington DC 111-333-222

所以我创建了一个结构来记录它。

typedef struct Person{
char name[20];
char address[30];
char phone[20];
} Person;

我尝试了很多方法将这个文件读入结构体,但都失败了。我累了害怕:

read_file = fopen("read.txt", "r");
Person temp;
fread(&temp, sizeof(Person), 100, read_file);
printf("%s %s %s \n", temp.name, temp.address, temp.phone);

但是 char 字符串并没有记录到由制表符分隔的 temp 中,它将整个文件读入 temp.name 并得到奇怪的输出。

然后我尝试了 fscanf 和 sscanf,它们都不能用于分隔标签

fscanf(read_file, "%s %s %s", temp.name, temp.address, temp.phone);

或者

fscanf(read_file, "%s\t%s\t%s", temp.name, temp.address, temp.phone);

这用空格分隔字符串,所以我分别得到 Bob 和 Jason,而事实上,我需要将“Bob Jason”作为一个字符串。我在创建文本文件时确实用制表符分隔了这些格式。

sscanf也一样,我尝试了很多次不同的方式...

请帮忙...

最佳答案

我建议:

  1. 使用 fgets 逐行读取文本。
  2. 使用strtok以制表符作为分隔符来分隔行的内容。


// Use an appropriate number for LINE_SIZE
#define LINE_SIZE 200
char line[LINE_SIZE];

if ( fgets(line, sizeof(line), read_file) == NULL )
{
// Deal with error.
}

Person temp;
char* token = strtok(line, "\t");
if ( token == NULL )
{
// Deal with error.
}
else
{
// Copy token at most the number of characters
// temp.name can hold. Similar logic applies to address
// and phone number.

temp.name[0] = '\0';
strncat(temp.name, token, sizeof(temp.name)-1);
}

token = strtok(NULL, "\t");
if ( token == NULL )
{
// Deal with error.
}
else
{
temp.address[0] = '\0';
strncat(temp.address, token, sizeof(temp.address)-1);
}

token = strtok(NULL, "\n");
if ( token == NULL )
{
// Deal with error.
}
else
{
temp.phone[0] = '\0';
strncat(temp.phone, token, sizeof(temp.phone)-1);
}

更新

使用辅助函数,可以减少代码的大小。 (感谢@chux)

// The helper function.
void copyToken(char* destination,
char* source,
size_t maxLen;
char const* delimiter)
{
char* token = strtok(source, delimiter);
if ( token != NULL )
{
destination[0] = '\0';
strncat(destination, token, maxLen-1);
}
}

// Use an appropriate number for LINE_SIZE
#define LINE_SIZE 200
char line[LINE_SIZE];

if ( fgets(line, sizeof(line), read_file) == NULL )
{
// Deal with error.
}

Person temp;
copyToken(temp.name, line, sizeof(temp.name), "\t");
copyToken(temp.address, NULL, sizeof(temp.address), "\t");
copyToken(temp.phone, NULL, sizeof(temp.phone), "\n");

关于c - 读取c中制表符分隔的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29479797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com