在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
指针,而不使用