我有一个.txt文件,其值以这种格式写成:LetterNumber,LetterNumber,LetterNumber等(例如:A1,C8,R43,A298,B4)。我想把字母和数字读成两个独立的数组(例如:array1将是A C R A B; array2将是1 8 43 298 4)。我怎样才能实现呢?
目前我只想出如何将所有值,包括数字和字母以及逗号和所有内容都读入一个字符数组:
FILE *myfile;
myfile = fopen("input1.txt", "r");
char input[677]; //I know there are 676 characters in my .txt file
int i;
if (myfile == NULL) {
printf("Error Reading File\n");
exit (0);
}
for (i=0; i<677; i++) {
fscanf(myfile, "%c", &input[i]);
}
fclose(myfile);
但理想情况下我想要两个数组:一个只包含字母而另一个只包含数字。它甚至可能吗?
我会感激任何帮助,即使只是一个提示。谢谢!
答案 0 :(得分:1)
为整数定义另一个数组,
int inputD[677];
然后在for循环中一次读取一个char,一个整数和一个空格char。
fscanf(myfile, " %c%d %*[,] ", &input[i], &inputD[i]);
答案 1 :(得分:1)
我实际上会定义一个结构来保持字母和数字在一起;数据格式强烈暗示他们有密切的关系。这是一个举例说明这个想法的程序。
scanf格式有些难以正确(意味着尽可能简单,但并不简单)。例如,RoadRunner忘记在答案中跳过字母前面的空格。
我们(我假设)只有单个字母。记住除%c之外的所有标准格式都跳过空格是有帮助的。 (应该记住那句话的两个部分。)
#include<stdio.h>
#define ARRLEN 10000
// Keep pairs of data together in one struct.
struct CharIntPair
{
char letter;
int number;
};
// test data. various space configurations
// char *data = " A1, B22 , C333,D4,E5 ,F6, Z12345";
void printParsedPairs(struct CharIntPair pairs[], int count)
{
printf("%d pairs:\n", count);
for(int i = 0; i<count; i++)
{
printf("Pair %6d. Letter: %-2c, number: %11d\n", i, pairs[i].letter, pairs[i].number);
}
}
int main()
{
setbuf(stdout, NULL);
setbuf(stdin, NULL);
// For the parsing results
struct CharIntPair pairs[ARRLEN];
//char dummy [80];
int parsedPairCount = 0;
for(parsedPairCount=0; parsedPairCount<ARRLEN; parsedPairCount++)
{
// The format explained>
// -- " ": skips any optional whitespace
// -- "%c": reads the next single character
// -- "%d": expects and reads a number after optional whitespace
// (the %d format, like all standard formats except %c,
// skips whitespace).
// -- " ": reads and discards optional whitespace
// -- ",": expects, reads and discards a comma.
// The position after this scanf returns with 2 will be
// before optional whitespace and the next letter-number pair.
int numRead
= scanf(" %c%d ,",
&pairs[parsedPairCount].letter,
&pairs[parsedPairCount].number);
//printf("scanf returned %d\n", numRead);
//printf("dummy was ->%s<-\n", dummy);
if(numRead < 0) // IO error or, more likely, EOF. Inspect errno to tell.
{
printf("scanf returned %d\n", numRead);
break;
}
else if(numRead == 0)
{
printf("scanf returned %d\n", numRead);
printf("Data format problem: No character? How weird is that...\n");
break;
}
else if(numRead == 1)
{
printf("scanf returned %d\n", numRead);
printf("Data format problem: No number after first non-whitespace character ->%c<- (ASCII %d).\n",
pairs[parsedPairCount].letter, (int)pairs[parsedPairCount].letter);
break;
}
// It's 2; we have parsed a pair.
else
{
printf("Parsed pair %6d. Letter: %-2c, number: %11d\n", parsedPairCount,
pairs[parsedPairCount].letter, pairs[parsedPairCount].number);
}
}
printf("parsed pair count: %d\n", parsedPairCount);
printParsedPairs(pairs, parsedPairCount);
}
我在我的cygwin环境中苦苦挣扎,在Windows 8上使用bash和mintty.%c有时会遇到换行符(ASCII 10),它应该被前面的空白区域吃掉,从而使解析脱轨。 (在出现错误之后,更强大的解析会尝试通过char读取char,直到遇到下一个逗号,并尝试从那里恢复。)
当我输入Ctr-D(或者,我认为,在控制台窗口中也是Ctr-Z)试图发出EOF信号时,就发生了这种情况。以下输入键击将导致换行符“达到”%c。当然,Windows系统上POSIX仿真中的文本I / O很棘手;我必须假设在来回翻译CR-NL序列之间的某个地方,这个bug会滑入。在Linux系统上通过ssh / putty它可以正常工作。
答案 2 :(得分:0)
您基本上只需创建一个char
数组和一个int
数组,然后使用fscanf
从文件流中读取值。
为简单起见,在这种情况下使用while
循环可以简化工作,因为您可以阅读从2
返回的fscanf
值,直到EOF
。
这样的事情是正确的想法:
#include <stdio.h>
#include <stdlib.h>
// Wasn't really sure what the buffer size should be, it's up to you.
#define MAXSIZE 677
int
main(void) {
FILE *myFile;
char letters[MAXSIZE];
int numbers[MAXSIZE], count = 0, i;
myFile = fopen("input1.txt", "r");
if (myFile == NULL) {
fprintf(stderr, "%s\n", "Error reading file\n");
exit(EXIT_FAILURE);
}
while (fscanf(myFile, " %c%d ,", &letters[count], &numbers[count]) == 2) {
count++;
}
for (i = 0; i < count; i++) {
printf("%c%d ", letters[i], numbers[i]);
}
printf("\n");
fclose(myFile);
return 0;
}