0

我有一个FILE变量,声明为FILE *fin. fin = fopen( "points.dat", "r" );在声明后初始化。我一直在尝试遍历finwhile fgetc( fin ) != '\n'。这就是我难过的地方。

我想将第 1 行的每个字符存储points.dat到 achar *中,稍后我可以调用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);

注意:这完全不是家庭作业。这只是在我真正完成家庭作业之前我需要开始工作的一件非常小的事情。

4

5 回答 5

2

您没有为 readFirst 分配任何内存,并且它也没有像 C 期望的那样以 NULL 字符终止。

最好使用 fgets 读取字符串并使用 fputs 写入字符串。这样你就不必寻找换行符。此外,如果您将写入文件的代码发布到文件中,这将很有用。

您还可以使用标准 c++ 文件处理(使用 std::iostream),使工作更加轻松。

于 2011-10-17T17:26:03.860 回答
1

你得到一个分段错误,因为char *readFirst;只声明了一个指针,但它没有保留任何空间来保存数据。

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

于 2011-10-17T17:28:12.143 回答
0

readFirst 是一个未初始化的 char 指针。您要么需要分配一个新的内存块来保存字符,要么将其分配给静态分配的字符数组。此外,如果您要一次读取一个字节的数据,则需要在将字符串传递给 atoi 之前将其终止为空,否则它将读取缓冲区的末尾和段错误。

看看你能不能从那里弄清楚。如果您需要更多帮助,请给我留言。

于 2011-10-17T17:33:28.300 回答
0

好吧,直接的问题是您没有留出任何内存readFirst指向. 当您编写 时,您正在尝试将值分配给您可能拥有或不拥有的某个随机内存位置(因此出现段错误)。readFirst[counter] = cc

如果您知道数组需要提前多大,您应该声明readFirst

char readFirst[SIZE];

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

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

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

于 2011-10-17T17:36:29.510 回答
0

当我看到这一点时,您只需使用char指针而不将其初始化为某些东西。这意味着您的指针指向某个未知的内存区域。如果幸运的话,您会遇到分段错误(这就是为什么初始化指向的指针NULL是个好主意),如果不是:欢迎来到未定义领域。

如果你想存储一些东西,你应该首先为它创建一些内存。您可以在堆栈 ( char readFirst[size]) 或堆 ( malloc()) 上执行此操作。在每种情况下,您都需要事先知道您需要多少内存。对于堆栈变体,您需要在编译时知道这一点,对于堆变体,您需要在运行时知道这一点。这当然意味着您需要一种方法来找出您需要多少内存。

于 2011-10-17T17:36:53.197 回答