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

C 从文本文件中读取字符串和整数,c,string,scanf,C,String,Scanf,比如说我有一个像这样的文件 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

比如说我有一个像这样的文件

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读取这个文件word,将数字放入浮点数组,将单词放入字符串数组。但是,经过几个小时的艰苦思考,我仍然不知道如何解决这个问题

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

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

如果文件的格式正好是这种格式,您可以轻松地使用
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);
#包含//for isspace()
#包括//for scanf()、getchar()和EOF
字符c2d[最大行数][最大长度每行字符串数];
字符*pstr;
浮动f2d[最大线][6];//每行6个浮点数
浮动*p;
int c,当前线路号;
char ch;
文件*输入;
输入=fopen(…);
如果(!输入)
... 处理错误
对于(当前线号=0;;++当前线号)
{
//处理每行输入
//首先读取6个浮点值
p=f2d+当前线路号;
c=fscanf(输入,“%f%f%f%f%f%f”,p+0、p+1、p+2、p+3、p+4、p+5);
如果(c!=6)
…在这里处理错误

//下一个抓取字符串;停止在“而不是使用
fscanf
我建议使用
fgets
来获取行。然后在该行上使用
sscanf
来获取数值,并搜索第一个字母字符以知道字符串的起始位置(使用例如)

大概是这样的:

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 */
}

您确定要将值读取为整数而不是浮点数吗?另外,请向我们展示。这些是文件中实际的

标记吗?此文件是XML还是HTML或其他文件?也许您应该使用解析库?如果文件正是此处显示的格式,您可以使用C对其进行解析,但脚本语言会更简单。…Python将是我的选择。您的文件总是这样组织的吗?在字符串之前有相同数量的数字?或者您必须检测您正在读取的是数字还是字符串?scanf不是读取文件的一种非常可靠的方法,因为如果格式有点改变,它将失败。@Douglas B.Stamp那么您重新编译什么end?
fscanf
将被用来代替
scanf
,对吗?输入不是来自stdin,而是来自一个文件。当然,和
fgetc()
代替
getchar()
。我更改了答案。如果我使用scanf,它会跳过每行末尾的字符串吗?根据
scanf()的手册页
,格式代码
%s
读取任何非空格字符序列,然后在遇到空格时停止。由于公司名称中可以有空格,我认为循环直到完成比尝试让
scanf()
执行我们想要的操作更容易。使用
scanf()时
使用
%f
格式代码,它将返回一个0,表示输入不是浮点数,并且浮点数中会有一些无意义的值…可能是一个0或垃圾,我没有检查。如果您愿意,可以尝试。感谢您的回复,但不幸的是,我不能使用sscanf,因为这是学校作业的一部分,所以我没有检查我必须根据我在课堂上学到的东西来做。@ProgrammingNerd永远不要害怕“跳出框框思考”…你可以做两个解决方案,一个是严格按照作业内容来做,然后列出可能存在的缺点,然后再列出一个解决作业但没有缺点的解决方案。@ProgrammingNerd不是说我的解决方案本身没有缺点,所有的解决方案都有优缺点,包括我的。是的,我总是尝试to以多种方式解决问题,尽管这不是最好的解决方案。这就是编程如此有趣和有趣的原因!哈哈