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

C reading in from a vertical line character delimited file

本文关键字:文件 读取 分隔 字符      更新时间:2023-10-16

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

TOM|149.62
JIM|23.25

我读过其他关于逗号、冒号和制表符分隔文件的文章,但这里作为%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[^|]%fn",&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[^|]|%fn", 
        &trade_User[i], &trade_Type[i], &trade_Tickers[i], &trade_Quantity[i], &trade_Prices[i]);
    printf("%s %c %s %d %fn", 
        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 = %fn", name, value);
    return 0;
}

顺便说一句:你似乎在使用C++编译器(因为"使用命名空间std"(。