我在将char数组从文件读取转换为int数组时遇到问题。也许有人可以帮助我。这是我的代码:
char vectorPatron[67];
int iPatrones[67];
archivo = fopen("1_0.txt", "r");
for(i=0;i<67;i++){
fscanf(archivo, "%c", &vectorPatron[i]);
printf("%c",vectorPatron[i]);
}
fclose(archivo);
for(i=0;i<67;i++){
iPatrones[i] = atoi(&vectorPatron[i]);
printf("%d",iPatrones[i]);
}
答案 0 :(得分:5)
尽管使用了一些C ++功能,但大多数代码看起来更像C.我可能会推荐更多类似的内容:
struct to_int {
int operator()(char c) { return c - '0'; }
};
const int num = 67;
std::vector<char> patrons(num);
std::vector<int> patron_values(num);
std::ifstream archivo("1_0.txt");
archivo.read(&patrons[0], num);
std::cout.write(&patrons[0], num);
std::transform(patrons.begin(), patrons.end(), patron_values.begin(), to_int());
std::copy(patron_values.begin(), patron_values.end(),
std::ostream_iterator<int>(std::cout, "\n"));
答案 1 :(得分:2)
那是因为atoi
收到一个空分隔的字符串,而你传递一个指向单个char
的指针(两者基本上都是char *
,但意图和用途不同)
将atoi
的来电替换为iPatrons[i] = vectorPatron[i] - '0';
此外,您可以移除vectorPatrons
数组,只需在第一个循环中读取一个char
,然后分配到iPatrons
数组中的相应位置。
答案 2 :(得分:1)
我相信你不能使用atoi
函数,因为它需要一个字符串(由\ 0字符终止的字符数组)。你为什么不这样做:
for(i=0;i<67;i++){
iPatrones[i] = int(vectorPatron[i] - '0');
printf("%d",iPatrones[i]);
}
注意:我不知道源文件是怎么样的,所以可能存在错误。这些数字究竟是如何存储在文件中的?也许你可以使用(如果它们被存储为以空格分隔的数字):
for(i=0;i<67;i++){
fscanf(archivo, "%d", &iPatron[i]);
}
答案 3 :(得分:0)
这是一种非常简单且可重复使用的方法。此函数将char
转换为int
并返回int
。 BAD_RETURN = 10
因为每个字符都是从'0'到'9'。该函数的来源是cplusplus.com。
int CharToInt(char ch)
{
return((ch >= '0' && ch <= '9') ? ch - '0' : BAD_RETURN);
}
这是我自己的功能,适用于VS2015编译器。定义一个int数组并将其初始化为0。将此int数组及其char原型数组传递给以下函数。此函数使用CharToInt函数将char数组转换为int数组:
void copyCharArrToIntArr(char from[MAX], int to[MAX])
{
for (int i = 0; i < MAX; i++)
to[i] = CharToInt(from[i]);
}
这种方法适用于矢量。而不是MAX,使用i < yourVector.size()
作为for循环条件。