我想读取文本文件,将该文本文件中的信息放入链接列表,关闭文件,然后使用链接列表将所有内容打印到我的程序中。 出于某种原因,在我的第一行之后我得到了“-858993460”,直到我点击我的15行,然后我收到一个错误:
ConsoleApplication14.exe中的0x5313B5F2(ucrtbased.dll)抛出异常:0xC0000005:访问冲突写入位置0xCCCCCCCC。
我正在阅读的清单:
TERMINATOR T-800 1
TERMINATOR T-1000 2
TERMINATOR T-800 3
TERMINATOR T-800 4
TERMINATOR T-1000 5
TERMINATOR T-800 6
TERMINATOR T-800 7
TERMINATOR T-800 8
TERMINATOR T-1000 9
TERMINATOR T-800 10
TORMONUTTUR T-800 101
TERMINATOR T-800 11
FEL FEL FEL
TERMINATOR T-1000 12
TERMINATOR T-800 13
TERMINATOR T-800 14
TERMINATOR T-800 15
TERMINATOR T-1000 16
TERMINATOR T-800 17
TERMINATOR T-800 18
TERMINATOR T-1000 19
TERMINATOR T-800 20
有人可以解释一下。
#include <stdio.h>
#include <stdlib.h>
struct Link {
char robot[15];
char terminatortyp[10];
int idnr;
struct Link *next;
};
struct Link *first = NULL;
int main(void) {
int antal = 0;
struct Link a;
FILE *tsin = fopen("textfil1R.txt", "r");
if (tsin == NULL) {
printf("Kunde inte läsa filen 'textfil.txt'.\n");
exit(EXIT_FAILURE);
}
struct Link *temp;
while (fgets(a.robot, sizeof a.robot, tsin) != NULL && fgets(a.terminatortyp, sizeof a.terminatortyp, tsin) != NULL && fscanf(tsin, "%d", &a.idnr) != EOF)
{
temp = malloc(sizeof(struct Link));
*temp->robot = a.robot;
*temp->terminatortyp = a.terminatortyp;
temp->idnr = a.idnr;
temp->next = first;
first = temp;
++antal;
}
fclose(tsin);
struct node *p;
p = first;
while (p != NULL)
{
printf("%s", a.robot);
printf("%s", a.terminatortyp);
printf("%d", a.idnr);
temp = temp->next;
}
printf("%d", antal);
getch();
return 0;
}
答案 0 :(得分:0)
您的代码中存在多个问题。
一个问题是你混合了fgets和fscanf。 fgets读取给定长度,无论读取什么(假设没有收到EOF)。因此,在第一个循环中,当您调用fgets(a.robot, sizeof a.robot, tsin)
时,它会读取15个字节并保存{{1}进入TERMINATOR T-80
,当您再次调用fgets时,它会再读取10个字节并将a.robot
保存到0 1\r\nTERMI
。现在,以下a.type
失败,因为下一个字符为fscanf
,不符合N
。
另一个问题是你正在指定像指针一样的数组,这就是产生错误的原因。 (错误的编译器没有为您找到此问题)。 %d
的类型为a.robot
,当您指定char [15]
,时,您正试图将*temp->robot = a.robot
分配给char [15]
( char
与*temp-robot
基本相同。这同样适用于下一行。您应该使用temp->robot[0]
(或更安全,strcpy
)。
关闭读取文件描述符后,什么是strncpy
???如何在条件struct node
循环时打印a.xxx
?通过分配 p != NULL
每个循环???