can';在c语言中不能从文件中读取字符串

can';在c语言中不能从文件中读取字符串,c,fopen,scanf,C,Fopen,Scanf,我试图逐行读取文本文件并打印前17个字符 FILE *devices; devices = NULL; devices = fopen("devices.txt", "r"); char deviceaddr[17]; char addr[17]; char line[1024]; while (fgets(line,1024,devices) != NULL) { fscanf(devices,"%s", deviceaddr); printf("%s\n", devi

我试图逐行读取文本文件并打印前17个字符

FILE *devices;
devices = NULL;
devices = fopen("devices.txt", "r");

char deviceaddr[17];
char addr[17];

char line[1024];

while (fgets(line,1024,devices) != NULL)
{
    fscanf(devices,"%s", deviceaddr);

    printf("%s\n", deviceaddr);
}

fclose(devices);

对于第一行,输出应该是
00:07:80:4C:0E:EE
,但是当
循环读取一行文本时,
fscanf
将读取下一组文本(可能会意外溢出该缓冲区)。似乎您应该在循环中从缓冲区
行打印所需的数据

例如,假设有三行文本

00:07:80:4C:0E:EE    --> ends up line buffer line
second               --> ends up in deviceaddr
third line           --> ends up in line (unless the fscanf did not consume newline)       

循环读取一行文本时,
fscanf
将读取下一组文本(可能会意外溢出该缓冲区)。似乎您应该在循环中从缓冲区
行打印所需的数据

例如,假设有三行文本

00:07:80:4C:0E:EE    --> ends up line buffer line
second               --> ends up in deviceaddr
third line           --> ends up in line (unless the fscanf did not consume newline)       

输出不可能是
“00:07:80:4c:0E:EE”
,因为 由于缓冲区的原因,这将导致未定义的行为 溢出字符串需要18个字节,但您只提供 17在
fscanf
中,如果没有 指定长度

阅读完后,您在
设备上调用
fscanf
一行;如果你在逐行阅读,你想使用
sscanf
在您阅读的行上

输出不可能是
“00:07:80:4c:0E:EE”
,因为 由于缓冲区的原因,这将导致未定义的行为 溢出字符串需要18个字节,但您只提供 17在
fscanf
中,如果没有 指定长度

阅读完后,您在
设备上调用
fscanf
一行;如果你在逐行阅读,你想使用
sscanf
在您阅读的行上 STD::IFSturis/Cube,使用“代码>(STD::GETLIN)< /CUT>,并使用前17个字符,使用<代码>子())/>代码。当使用固定大小的数组时,不要忘记尾随“0”。您是指打印每行的前17个字符吗?@ HMJD。我只得到符号和东西。您确定您是指C++吗?这是纯C,这比C++多很多。C++将使用<代码> STD::IFSturis/Cube,使用“<代码>(STD::GETLIN)< /CUT>,并使用前17个字符,使用代码< >子())/>代码。当使用固定大小的数组时,不要忘记尾随“0”。您是指打印每行的前17个字符吗?@ HMJD.我只得到符号和东西。我正在逐行阅读。此代码用于从文件而不是字符串中读取int。如果它使用相同的逻辑(fgets后跟fscanf),则肯定会跳过第一行文本。如果fscanf不使用换行符,那么FGET将在每次fscanf调用后有效地读取换行符。因此,除了“丢弃”第一行之外,它还可以“根据需要”工作。我正在尝试逐行阅读。此代码用于从文件而不是字符串中读取int。如果它使用相同的逻辑(fgets后跟fscanf),则肯定会跳过第一行文本。如果fscanf不使用换行符,那么FGET将在每次fscanf调用后有效地读取换行符。因此,除了“丢弃”第一行之外,它还可以“根据需要”工作。