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")。
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")。