-1

我有一个file.txt包含一些 int 变量。我需要将第三组数字转换为 int array,以便我可以按照我想要的方式操作数据:

EX: file.txt
============

111111 1001 20120131 30
122222 2002 20110230 25
133333 3003 20100325 12
144444 1001 20110526 18
155555 1001 20100524 25
166666 2002 20120312 30
177777 2003 20120428 28
188888 3003 20111214 15
199999 3002 20101113 27
199999 1001 20101202 29
133333 1001 20120715 25
155555 1001 20100204 24
177777 3003 20110102 30    

我需要逐行读取文件,并fscanf为此选择了函数:

FILE *fp;

int n1, n2, n4;
char n3[9];
int array[9]

[...]

while (fscanf (fp, "%d %d %s %d", &n1, &n2, n3, &n4);

现在我有了字符串,如何将其转换为 int 数组?我试过:

for (i = 0; i < strlen(n3); i++)
    array[i] = atoi(strlen[i])

但它出错了......我该如何解决这个问题?

它返回给我:

warning: passing argument 1 of ‘atoi’ makes pointer from integer without a cast [enabled by default]
/usr/include/stdlib.h:148:12: note: expected ‘const char *’ but argument is of type ‘char’
4

4 回答 4

2

你需要类似的东西:

int array[HUGE];

for (int i = 0; i < HUGE && fscanf(fp, "%d %d %s %d", &n1, &n2, n3, &n4) == 4; ++i)
{
    array[i] = atoi(n3);
}

基本问题是如果你不知道你的文件有多少行,那么你就不知道你的收件人数组有多大。更安全的解决方案是使用带有mallocand的动态数组realloc

在这点上,将字符串读入 achar[9]也是非常危险的:如果文件包含错误的数据,你的程序就会死掉,或者更糟。首先使用 将文件逐行读入字符串fgets,然后分别标记和解析每一行,例如使用strtoul.

于 2012-06-24T16:13:36.673 回答
1

至少据我了解您的问题,您只真正关心第三列中的数字。假设是这种情况,我想我会做更多这样的事情:

for (i=0; i<elements(array); i++)
    if (0 == fscanf(infile, "%*d %*d %d %*d", array+i))
        break;
于 2012-06-24T16:15:31.883 回答
1

如果您真的只想将第三个元素作为整数,那么为什么不在调用 fscanf 时将其作为整数读入呢?即,我认为以下内容将大致完成您想要的操作:

#define MAX_VALUES 9

FILE *fp;

int n1, n2, n3, n4;
int array[MAX_VALUES]
int num_values;

while (fscanf (fp, "%d %d %d %d", &n1, &n2, &n3, &n4) && (num_values<MAX_VALUES))
    array[num_values++] = n3;
于 2012-06-24T16:17:45.180 回答
0

如果您想要每行包含 8 个单个数字的数组,那么您可以执行以下操作:

for ( i = 0; i < 8; i++ ) {
    array[i] = n3[i] - '0';
}

但是,正如其他人所说,对于 n3[] 和 array[] 的长度依赖文件格式并不是一个好主意,即使我在将 strlen() 替换为 8 时做了完全相同的事情。

我可能会 strtok() 使用空格作为分隔符的每一行,然后对数据进行一些验证以确保它是您的想法。

PS第三列看起来像一个日期,你确定要一个int数组吗?

于 2012-06-24T18:42:29.207 回答