C - 从文件中读取int和chars到数组中

时间:2016-12-02 13:05:19

标签: c arrays file

我有一个.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);

但理想情况下我想要两个数组:一个只包含字母而另一个只包含数字。它甚至可能吗?

我会感激任何帮助,即使只是一个提示。谢谢!

3 个答案:

答案 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;
}