我有一个FILE
变量,声明为FILE *fin
。声明后初始化fin = fopen( "points.dat", "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);
注意:这不是它的整体作业。在我真正完成家庭作业之前,这只是一件非常小的事情。
答案 0 :(得分:2)
您没有为readFirst分配任何内存,也没有像C期望的那样以NULL字符终止。
最好使用fgets读取字符串和fputs来编写字符串。这样你就不必寻找换行符了。 此外,如果您将写入代码发布到文件中将会很有用。
您还可以使用标准的c ++文件处理(使用std :: iostream),以使工作更轻松。
答案 1 :(得分:1)
您遇到分段错误,因为char *readFirst;
仅声明指针,但它不会保留任何空间来保存数据。
直接将readFirst
声明为数组(char readFirst[size];
)或使用函数malloc()
分配空间。
答案 2 :(得分:0)
readFirst是一个未初始化的char指针。您需要分配一个新的内存块来保存字符或将其分配给静态分配的字符数组。此外,如果您要一次读取一个字节的数据,则需要在将字符串传递给atoi之前将其终止,否则它将读取传递缓冲区的末尾和段错误。
看看你是否可以从那里弄明白。如果您需要更多帮助,请给我留言。
答案 3 :(得分:0)
嗯,当前的问题是你没有为readFirst
留出任何内存来指向到。当您编写readFirst[counter] = c
时,您尝试将c
的值分配给您可能拥有或不拥有的某个随机内存位置(因此是段错误)。
如果你知道数组需要提前多大,你应该将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
相同的错误处理能力1}})。
答案 4 :(得分:0)
当我看到这一点时,您只需使用char
指针而不将其初始化为某些内容。这意味着你的指针指向一些未知的内存区域。如果你很幸运,你会遇到一个分段错误(这就是为什么初始化一个指向NULL
的指针是个好主意),如果不是这样的话:欢迎来到未定义的领域。
如果你想存储一些东西,首先应该为它创建一些内存。您可以在堆栈(char readFirst[size]
)或堆(malloc()
)上执行此操作。在每种情况下,您都需要事先知道需要多少内存。您需要在编译时知道堆栈变量以及堆变体的运行时。那当然意味着你需要一种方法来找出你需要多少内存。