3

假设我有一个文件看起来像这样

51.41 52.07 52.01 51.22 50.44 49.97 Coal Diggers
77.26 78.33 78.29 78.12 77.09 75.74 Airplane Flyers
31.25 31.44 31.43 31.09 31.01 30.92 Oil Fracting and Pumping
52.03 12.02 12.04 22.00 31.98 61.97 Big Bank
44.21 44.32 44.29 43.98 43.82 43.71 Rail Container Shipping
93.21 93.11 93.02 93.31 92.98 92.89 Gold Bugs

我想使用 fscanf 读取这个文件字,将数字放在浮点数组中,将字放在字符串数组中。但是,经过几个小时的艰苦思考,我仍然无法弄清楚如何解决这件事。

void dataInsert (COMPANY* company1, COMPANY* company2, COMPANY* company3, COMPANY* company4, COMPANY* company5, COMPANY* company6)
{
//Function Declaration
FILE* spData;
float number;
char* name[20];

//Statement
if ((spData = fopen("dataFile","r")) == NULL)
{
    fprintf(stderr, "ERROR OPENING!!");
    exit (1);
}

int i = 0;
int numCount = 0;
int lineCount = 0;
while (fscanf(spData, "%f", &number) != EOF)
{
    if(isdigit(number))
    {
        if (lineCount == 0)
        {
            company1 -> stock_price[i] = number;
        }
        else if (lineCount == 1)
        {
            company2 -> stock_price[i] = number;
        }
        else if (lineCount == 2)
        {
            company3 -> stock_price[i] = number;
        }
        else if (lineCount == 3)
        {
            company4 -> stock_price[i] = number;
        }
        else if (lineCount == 4)
        {
            company5 -> stock_price[i] = number;
        }
        else if (lineCount == 5)
        {
            company6 -> stock_price[i] = number;
        }

        numCount++;
        i++;
        if (numCount == 6)
        {
            lineCount++;
            numCount = 0;
            i = 0;
        }
    }
}//while
fclose (spData);
}//dataInsert

我不知道如何处理每行末尾的字符串。我想把这些字符串放在结构公司-> 名称 [10] 中。这些数据在一个文本文件中。

4

2 回答 2

4

fscanf我建议不要使用fgets来获取线路。然后sscanf在该行上使用以获取数值,并搜索第一个字母字符以了解字符串的开始位置(使用 eg strspn)。

像这样的东西:

char line[256];

while (fgets(line, sizeof(line), fp) != NULL)
{
    /* Get the numbers */
    float numbers[6];
    sscanf(line, "%f %f %f %f %f %f",
        &numbers[0], &numbers[1], &numbers[2],
        &numbers[3], &numbers[4], &numbers[5]);

    /* Where do the numbers end... */
    size_t numbers_end = strspn(line, "1234567890. \t");

    /* And get the name */
    char *name = line + numbers_end;

    /* Do something with the numbers and the name */
}
于 2013-03-09T04:23:52.047 回答
2

如果文件正是该格式,您可以scanf()轻松使用。这是一些可以帮助您入门的代码;我没有对此进行测试,您需要填写一些缺失的内容。

#include <ctypes.h>  // for isspace()
#include <stdio.h> // for scanf(), getchar(), and EOF

char c2d[MAX_LINES][MAX_LENGTH_STRING_PER_LINE];
char *pstr;
float f2d[MAX_LINES][6]; // 6 floats per line
float *p;
int c, current_line_number;
char ch;
FILE *input;

input = fopen(...);
if (!input)
    ... handle the error

for (current_line_number = 0; ; ++current_line_number)
{
    // handle each line of input

    // first read 6 float values
    p = f2d + current_line_number;
    c = fscanf(input, "%f %f %f %f %f %f", p + 0, p + 1, p + 2, p + 3, p + 4, p + 5);
    if (c != 6)
        ... handle the error here

    // next grab string; stop at '<' or end of line or EOF
    pstr = c2d + current_line_number;
    for (;;)
    {
        ch = fgetc(input);
        if (ch == EOF || ch == '<' || ch == '\n')
        {
            *pstr = '\0';
            break;
        }
        *pstr++ = ch;
    }
    if (ch == '<')
    {
        // char was '<' so throw away rest of input line until end of line
        for (;;)
        {
            if (ch == EOF || ch == '\n')
                break;
            ch = fgetc(input);
        }
    }
    for (;;)
    {
        // eat up any white space, including blank lines in input file
        if (ch == EOF || !isspace(ch))
            break;
        ch = fgetc(input);
    }
    // once we have hit end of file we are done; break out of loop
    if (ch == EOF)
        break;
}

fclose(input);

scanf()不习惯在行尾读取字符串,因为它在遇到空格时停止,并且您的字符串值中有空格。

如果输入文件并不总是六个浮点值,则需要编写代码一次调用scanf()一个浮点数,直到遇到无法解析为浮点数的内容,并且需要使浮点数数组足够宽处理每行允许的最大浮点数。

祝你好运。

于 2013-03-09T02:26:19.683 回答