gpt4 book ai didi

C线读取突然停止

转载 作者:行者123 更新时间:2023-11-30 21:21:01 26 4
gpt4 key购买 nike

我正在读取一个 .csv 文件:

FILE * fPointer; = fopen(fileName, "r");
char singleLineContent[150];

while(fgets(singleLineContent, 150, fPointer))
{
/* data handling */
}

它在第 40239 行停止读取文件。我不知道为什么。

这是整个文件。它返回-1。文件中有超过 100 万行。我还用这些数据编写了另一个文件:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

int main()
{
printf("Type the name of a file to be read (30 character max): ");
char fileName[30];
scanf("%s", fileName);
printf("Type the name of destination file (30 character max): ");
char fileNameW[30];
scanf("%s", fileNameW);
FILE * fPointerForWriting = fopen(fileNameW, "w");
FILE * fPointer;
fPointer = fopen(fileName, "r");

int i = 1;
char singleLineContent[150];

while(fgets(singleLineContent, 150, fPointer))
{
char *token = strtok(singleLineContent, ",\n");
fprintf(fPointerForWriting, "%d", atoi(token));
token = strtok(NULL, ",\n");
fprintf(fPointerForWriting, ",%d %d\n", atoi(token), i);
if(token == NULL)
{
printf("There are no tokens\n");
return -3;
}
i++;
}

fclose(fPointerForWriting);
fclose(fPointer);

return 0;
}

它说我需要添加更多非代码的详细信息。它说我需要添加更多非代码的细节。它说我需要添加更多非代码的细节。它说我需要添加更多非代码的细节。它说我需要添加更多非代码的细节。它说我需要添加更多非代码的细节。它说我需要添加更多非代码的详细信息。

最佳答案

您应该更加小心地从 stdin 读取文件名:如果您输入超过 29 个字符,scanf 可能会导致缓冲区溢出。即使您在提示中提到的 30 个字符也太多了。使用此格式:

scanf("%29s", fileName);

这将防止潜在的未定义行为,但您应该通过测试返回值来添加适当的检查以检查错误情况,例如文件结尾。此外,scanf 是一个非常糟糕的读取文件名的 API,它会在第一个空格字符处停止,这在当今的文件名中很常见。

读取文件名的更好解决方案是:

fgets(fileName, sizeof(fileName), stdin);
fileName[strcspn(fileName, "\n")] = '\0';

同样,您应该检查文件是否可以成功打开。

最后,如果您读取开头少于 2 个数字的行,您的解析器将无法检测到并调用未定义的行为:

    char *token = strtok(singleLineContent, ",\n");
fprintf(fPointerForWriting, "%d", atoi(token));
token = strtok(NULL, ",\n");
fprintf(fPointerForWriting, ",%d %d\n", atoi(token), i);
if(token == NULL)
{
printf("There are no tokens\n");
return -3;
}

如果 tokenNULLatoi(token) 会调用未定义的行为:它很可能使您的程序崩溃,退出代码为 -1.

添加适当的测试,如下所示:

    if (!strchr(singleLineContent, '\n')) {
printf("line %d too long: %s\n", i, singleLineContent);
}
char *token = strtok(singleLineContent, ",\n");
if (token == NULL) {
printf("No numbers at line %d\n", i);
return -3;
}
fprintf(fPointerForWriting, "%d", atoi(token));
token = strtok(NULL, ",\n");
if(token == NULL) {
printf("Missing number at line %d\n", i);
return -3;
}
fprintf(fPointerForWriting, ",%d %d\n", atoi(token), i);

关于C线读取突然停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30652132/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com