我正在读取一个包含数字的数据文件并提取一些数字并将它们转换为一个整数。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE* fp = fopen("data.txt", "r");
int i;
char data[5];
for(i = 0; i < 5; i++)
{
data[i] = fgetc(fp);
}
fclose(fp);
}
我在char矩阵中有一个日期数组,并希望为日期月份和年份分别设置数组。如何从数据文件中取出任何n个数字并将它们转换为n位整数?我已经尝试了strcat,然后是atoi但是我对指针缺乏了解并且我不断收到错误消息?
I / O:
输入数据(银行对账单):
09,08,2014,"BOOK SHOP",12.34,5.67,
10,08,2014,"CAR MECHANIC",52.44,5.67,
11,08,2014,"CHIP SHOP",67.34,5.67,
所需的输出是日期,月份,年份,购买地点,金额和余额的单独数组。我为每个都有单独的数组,但数字是字符串而不是整数。如何将每列转换为整数数组?
答案 0 :(得分:1)
如果你NULL
终止你的字符数组,那么就C而言它实际上是一个数字的字符串表示。然后,您可以直接在其上使用atoi()
:
int data_int;
char data_str[N+1];
for (i = 0; i < N; i++)
{
data_str[i] = fgetc(fp);
/* to be really sure, you should make sure each character
* you read is a decimal digit from '0' - '9'
*/
}
data_str[N] = '\0';
data_int = atoi(data_str);
答案 1 :(得分:1)
我假设您有兴趣阅读以下数据:
09,08,2014,"BOOK SHOP",12.34,5.67,
10,08,2014,"CAR MECHANIC",52.44,5.67,
11,08,2014,"CHIP SHOP",67.34,5.67,
看起来您可以使用fscanf()
,但您需要小心:
int day[20];
int month[20];
int year[20];
char name[20][15];
double amount[20];
double balance[20];
for (int i = 0; i < 20; i++)
{
if (fscanf(fp, "%d ,%d ,%d , \" %14[^\"] \" ,%lf ,%lf ,",
&day[i], &month[i], &year[i], name[i],
&amount[i], &balance[i]) != 6)
break;
}
您可能不需要每个空格,并且您永远不会知道该行上的最后一个逗号是否丢失。请注意,代码通过限制循环上的迭代次数和限制字符串字段的长度来避免缓冲区溢出。我只选择15
作为名称的长度,以便明确哪个数字是条目数,哪个是每个条目的长度。
您可能更喜欢fgets()
和sscanf()
方法:
int day[20];
int month[20];
int year[20];
char name[20][15];
double amount[20];
double balance[20];
char buffer[4096];
int i; // Outside loop so it can be accessed after the loop
for (i = 0; i < 20 && fgets(buffer, sizeof(buffer), fp) != 0; i++)
{
if (sscanf(buffer, "%d ,%d ,%d , \" %14[^\"] \" ,%lf ,%lf ,",
&day[i], &month[i], &year[i], name[i],
&amount[i], &balance[i]) != 6)
break;
}
这将拒绝不匹配的行,而使用fscanf()
的原始代码将直接使用这样的数据:
09,08,2014,"BOOK SHOP",12.34,5.67,10,08,2014,"CAR MECHANIC",
52.44,5.67,11,
08,
2014,
"CHIP SHOP",
67.34,
5.67,
显示的代码或多或少取代了char data[5];
到循环结束时问题中的行。您可以添加代码来打印读取的值。
for (int j = 0; j < i; j++)
printf("%.4d-%.2d-%.2d %-14s %8.2f %8.2f\n",
year[j], month[j], day[j], name[j], amount[j], balance[j]);