从文本文件中读取字符串和整数

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

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 

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

如果文件格式正好,则可以轻松使用scanf() 。 这里有一些代码可以帮助您入门; 我没有测试过这个,你需要填写一些遗漏的东西。

 #include  // for isspace() #include  // 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()来读取行尾的字符串,因为它在遇到空格时停止,并且你的字符串值中有空格。

如果输入文件并不总是六个浮点值,则需要编写代码来一次调用一次浮点运算,直到你遇到一个不能解析为float的东西,你需要创建一个浮点数组。浮动宽度足以处理每行允许的最大数量的浮子。

祝好运。

而不是使用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 */ }