C 从竖线字符分隔的文件中读入

C reading in from a vertical line character delimited file

C 新手并尝试读取文本文件,"stocks",用竖线“|”分隔人物。目的是打开每行都有一个字符串和浮点值的文件,格式为:

TOM|149.62
JIM|23.25

我读过其他关于逗号、冒号和制表符分隔文件的帖子,但是 "scanset" 建议在这里作为 %s%f 之间的 [^|] 应用并没有' 似乎工作。我似乎至少现在已经设法存储了字符串的第一个字符,但是保存的浮点值是无稽之谈。这稍后将写入文件后声明的数组,但显示每行的字符串和浮点值的基本情况意味着我可以自己继续。感谢您能给我的任何帮助。

#include <iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;

// TOM|149.62
// JIM|23.25


int main()
{
    FILE *stocks;

    char *stock_Tickers[100];
    float stock_Prices[100];

    if ((stocks = fopen("Stocks.txt", "r")) == NULL)
    {
        fprintf(stderr, "Error opening file.\n");
        exit(1);
    }

    char tempchar;
    float tempfloat;

    for (int i = 0; i < sizeof (stock_Tickers); i++)
    {
        if (feof(stocks))
        {
            break;
        }
        fscanf(stocks, "%s[^|]%f\n",&tempchar,&tempfloat);
        cout << tempchar << " " << tempfloat;
        cin.get();
    }
    return 0;
}

更新:@Michel Billaud 抱歉,我还有最后一个错误。你的方法工作得很好,但是当我在这个轻微的变体上尝试它时,它开始在最后一个浮点上打印垃圾并在后续循环中中断。查看局部变量,最后一个数组没有更新。我认为这与新行有关,因为当我将浮点数更改为整数时它仍然不起作用。你能看出我可能做错了什么吗,因为它对我来说似乎是相同的格式?这次的格式是Ryan|B|IBM|100|176.10。在此之后读入所有文件...谢谢。

FILE *trades;
    // Ryan|B|IBM|100|176.10    
    // Ryan|S|IBM|50|177.10

    char trade_User[100][20];
    char trade_Type[100];
    char trade_Tickers[100][4];
    int trade_Quantity[100];
    float trade_Prices[100];
    int trade_Count = 0;

    if ((trades = fopen("Trades.txt","r")) == NULL)
    {
        fprintf(stderr, "Error opening file.\n");
        exit(1);
    }

    for (int i = 0; i < sizeof(trade_Tickers); i++)
    {
        if (feof(trades))
        {
            break;
        }
    fscanf(trades, "%19[^|]|%1[^|]|%4[^|]|%d[^|]|%f\n", 
        &trade_User[i], &trade_Type[i], &trade_Tickers[i], &trade_Quantity[i], &trade_Prices[i]);
    printf("%s %c %s %d %f\n", 
        trade_User[i], trade_Type[i], trade_Tickers[i], trade_Quantity[i], trade_Prices[i]);
    trade_Count++;
}

提示: 当尝试使用有问题的功能时,请在一个单独的小程序中执行。所以你不会因为另一个不相关的问题而冒险得出错误的结论。

// just playing with |-separated fields

#include <stdio.h>

int main(int argc, char **argv)
{
    char line[]="TOM|1234.56";
    char name[20];
    float value;
    sscanf(line, "%[^|]|%f", name,  &value);
    printf("name = %s, value = %f\n", name, value);
    return 0;
}

顺便说一下:您似乎正在使用 C++ 编译器(因为 "using namespace std")。