假设我有一个看起来像这样的文件
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]。这些数据在文本文件中。
答案 0 :(得分:4)
我建议您使用fscanf
来获取该行,而不是使用fgets
。然后在该行上使用sscanf
来获取数值,并搜索第一个字母字符以了解字符串的开始位置(使用例如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 */
}
答案 1 :(得分: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()
一个浮点数,直到你遇到一个不能解析为float的东西,你需要使浮动数组足够宽,以处理每行允许的最大数量的浮点数。