在C语言中从文件中读取一个数字并将其转换为整数

在C语言中从文件中读取一个数字并将其转换为整数,c,file,atoi,C,File,Atoi,我有一个FILE变量,声明为FILE*finfin=fopen(“点数据”,“r”)在声明后初始化。我一直试图在fin中循环,而fgetc(fin)!='\n'。这就是我被难倒的地方 我想将points.dat的第1行上的每个字符存储到char*中,稍后我可以调用atoi将其存储为整数。我该怎么做?我已经试过了,但是我不断地遇到分割错误和其他奇怪的错误。以下是我的最新尝试: FILE *fin; char c; int counter = 0; int countPoints; char *re

我有一个
FILE
变量,声明为
FILE*fin
<代码>fin=fopen(“点数据”,“r”)在声明后初始化。我一直试图在
fin
中循环,而
fgetc(fin)!='\n'
。这就是我被难倒的地方

我想将
points.dat的第1行上的每个字符存储到
char*
中,稍后我可以调用
atoi
将其存储为整数。我该怎么做?我已经试过了,但是我不断地遇到分割错误和其他奇怪的错误。以下是我的最新尝试:

FILE *fin;
char c;
int counter = 0;
int countPoints;
char *readFirst;

fin = fopen( "points.dat", "r" );

while( ( c = fgetc( fin ) ) != '\n' ) {

    readFirst[counter] = c;
    counter++;
}

countPoints = atoi( readFirst );

printf("%d\n", countPoints);

注意:这不是一个完整的家庭作业。这只是一件很小的事情,我需要开始工作,然后才能真正完成家庭作业。

您没有为readFirst分配任何内存,而且它也没有像C所期望的那样以空字符结尾

最好使用FGET读取字符串,使用FPUT写入字符串。这样你就不必去寻找新线了。 此外,如果您将编写代码发布到文件中,这将非常有用


您也可以使用标准C++文件处理(使用STD:IOSROW),使作业更容易。

< P>您没有分配任何内存来进行读取,也没有终止与C所期望的空字符。 最好使用FGET读取字符串,使用FPUT写入字符串。这样你就不必去寻找新线了。 此外,如果您将编写代码发布到文件中,这将非常有用


您也可以使用标准C++文件处理(使用STD:IOSROW),使作业更容易。

< p>您会得到一个分段错误,因为<代码> char * Read第一;code>只声明一个指针,但它不保留任何空间来保存数据


要么直接将
readFirst
声明为数组(
char readFirst[size];
),要么使用函数
malloc()
分配空间。

由于
char*readFirst
只声明一个指针,但它不保留任何空间来保存数据


readFirst
直接声明为数组(
char readFirst[size];
),或者使用函数
malloc()
分配空间。

readFirst是未初始化的字符指针。您需要分配一个新的内存块来保存字符,或者将其分配给静态分配的字符数组。此外,如果要一次读取一个字节的数据,则需要在将字符串传递到atoi之前以null终止该字符串,否则该字符串也将读取缓冲区的末尾和segfault


看看你能不能从那里找到答案。如果你需要更多的帮助,请给我留言

readFirst是一个未初始化的字符指针。您需要分配一个新的内存块来保存字符,或者将其分配给静态分配的字符数组。此外,如果要一次读取一个字节的数据,则需要在将字符串传递到atoi之前以null终止该字符串,否则该字符串也将读取缓冲区的末尾和segfault


看看你能不能从那里找到答案。如果你需要更多的帮助,请给我留言

好吧,直接的问题是您没有为
readFirst
指定任何内存。当您写入
readFirst[counter]=c
时,您试图将
c
的值分配给您可能拥有或不拥有的某个随机内存位置(因此存在SEGFULTS)

如果您提前知道阵列需要有多大,则应将
readFirst
声明为

char readFirst[SIZE];
平均大约需要3.3位来表示一个十进制数字;将其四舍五入到3,您可以将数组大小计算为
int
的位宽除以3加2作为符号和0终止符。因此,32位int需要一个9+2=11个字符的数组。64位整数值需要22+2=24

但这一切都引出了另一个问题;是否需要一次读取一个字符的输入,然后转换为整数值?如果输入文件只是整数的文本表示,则可以绕过整个混乱,只需将
fscanf
%d
转换说明符一起使用(尽管这有其自身的问题)


或者,您可以使用
fgets
一次读取整个文本字符串,并使用
strtol
转换文本(
atoi
不提供与
strtol
相同的错误处理能力)

好吧,直接的问题是您没有为
readFirst
指定任何内存。当您写入
readFirst[counter]=c
时,您试图将
c
的值分配给您可能拥有或不拥有的某个随机内存位置(因此存在SEGFULTS)

如果您提前知道阵列需要有多大,则应将
readFirst
声明为

char readFirst[SIZE];
平均大约需要3.3位来表示一个十进制数字;将其四舍五入到3,您可以将数组大小计算为
int
的位宽除以3加2作为符号和0终止符。因此,32位int需要一个9+2=11个字符的数组。64位整数值需要22+2=24

但这一切都引出了另一个问题;是否需要一次读取一个字符的输入,然后转换为整数值?如果输入文件只是整数的文本表示,则可以绕过整个混乱,只需将
fscanf
%d
转换说明符一起使用(尽管这有其自身的问题)


或者,您可以使用
fgets
一次读取整个文本字符串,并使用
strtol
转换文本(
atoi
不提供与
strtol
相同的错误处理能力)

当我看到这一点时,您只需使用
char
指针,而不使用