gpt4 book ai didi

c - 使用 getchar() 读取制表符分隔的文件

转载 作者:太空狗 更新时间:2023-10-29 15:28:35 25 4
gpt4 key购买 nike

我正在尝试使用输入重定向读取文本文件,./program < file.txt ,我制作的文件如下所示:

Country\tSport\tGender\tMedal\n
America\tCycling\tMens\tGold\n
New Zealand\tSwimming\tWomens\tSilver\n
India\tBadminton\tMens\tbronze\n

它只是读取一些随机数据,根据第一行有 4 列,标题为 Country , Sport , GenderMedal .

我还插入了 \t\n使文件更具可读性,但文件中实际上有制表符和换行符。

我正在尝试读取该文件的每一行,并将它们存储在一个字符串数组中,我将其声明为:

char *records[ROWS][COLUMNS];

我想要字符串数组,records看起来像:

{{"Country", "Sport", "Gender", "Medal"}, {"America", "Cycling", "Mens", "Gold"}, 
{"New Zealand", "Swimming", "Womens", "Silver"}, {"India", "Badminton", "Mens", "Bronze"}}

到目前为止,我一直在使用 scanf像这样阅读这些行:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ROWS 1000
#define COLS 30
#define MAX_CH 50

int
main(int argc, char *argv[]) {
char *records[ROWS][COLS];

char country[MAX_CH];
char sport[MAX_CH];
char gender[MAX_CH];
char medal[MAX_CH];

while (scanf("%s\t%s\t%s\t%s\n", country, sport, gender, medal) == 4) {
printf("%s %s %s %s\n", country, sport, gender, medal);
}

return 0;
}

我知道这不能作为国家名称 New Zealand在两个字符串之间有一个空格,而我的 scanf只会读取前四个字符。我的方法scanf也不会有效,因为它只适用于 4 列。

有什么方法可以使用 getchar()而不是这样做?我只是不确定如何使用 getchar分析输入流中的每个字符,并根据制表符和换行符将必要的字符转换为字符串。

最佳答案

使用 getChar() 的伪代码:

while (char = getChar()) is not 'EOF': // EOF = End of file
if char is not '\t' and char is not '\n'
save into current string
else if char is '\t'
terminate current string
increment column index
else if char is '\n'
terminate current string
increment row index

编辑:

getChar() 的问题在于,您只知道到达下一个选项卡后字符串的长度。

因此,您要么必须第一次迭代以了解字符串的长度,然后分配适当数量的内存,要么您需要始终分配安全数量的内存(您的最大字符串长度)。

然后在这两个选项中,您可以使用 strcat() 来连接字符串,但您也可以访问 char* 中的 charchar[](字符串)按其索引:

char string[] = "MINE"; // string[0] -> 'M'
string[0] = 'N'; // string -> "NINE"

// with dynamic memory allocation
char *string = (char*) malloc(5*sizeof(char));
string[0] = 'N'; // string -> "N"

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

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