gpt4 book ai didi

无法从 C 中的文本文件中读取所有名称

转载 作者:太空宇宙 更新时间:2023-11-03 23:47:04 26 4
gpt4 key购买 nike

我正在编写一个从文件中读取名称的程序。如果没有段错误,我无法读取所有名称。这是我的代码。

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

typedef struct node{
char *name;
int index;
}node;

int main(void){
char *someString;
struct node *TEST;

TEST = (node*)malloc(sizeof(node));

FILE *filePointer;
filePointer = fopen("data2.txt","r");

int lineCount = 0;
//while(fscanf(filePointer, "%s", &someString) != EOF){
while(1){
if (!feof(filePointer)){
fscanf(filePointer, "%s", &someString);
printf("String from file: %s\n", &someString);
}
else{
break;
}
}
}

最佳答案

您在此代码的两个位置使用 &somePointer 是错误的。 &somePointer 的结果是 char**。当应用一元寻址运算符 & 时,结果是指向类型的指针。由于 somePointer 是一个 char*,这意味着 &somePointer 是一个 char**不是 你想要什么。使用 scanf 时使用 %s 格式说明符是错误的,对于 printf 也是如此。

这两个函数都需要 char 缓冲区的地址,而不是 char 指针的地址。虽然您可能认为仅使用 somePointer 就可以,但实际上它不会,因为即使那样该变量也是不确定的。您永远不会为指针提供 char 缓冲区所在的有效地址。

而且,您的 while 循环逻辑是错误的。它相当于一个 while(!feof(filePointer)) 循环,这几乎总是错误的。您可以阅读更多相关信息 here

以下是一段简单的代码,可从文件中安全地读取最多 127 个字符宽的字符串,直到文件耗尽或遇到错误:

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

int main()
{
char buff[128];

FILE *fp = fopen("data2.txt","r");
if (fp == NULL)
{
perror("data2.txt");
return EXIT_FAILURE;
}

while (fscanf(fp, "%127s", buff) == 1)
{
printf("String from file: %s\n", buff);
}

fclose(fp);

return 0;
}

添加一个指向这个的指针给出了稍微修改过的:

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

int main()
{
char buff[128];
char *somePointer = buff;

FILE *fp = fopen("data2.txt","r");
if (fp == NULL)
{
perror("data2.txt");
return EXIT_FAILURE;
}

while (fscanf(fp, "%127s", somePointer) == 1)
{
printf("String from file: %s\n", somePointer);
}

fclose(fp);

return 0;
}

接下来,动态分配而不是固定的自动缓冲区。这给了我们:

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

int main()
{
char *somePointer = malloc(128);
if (somePointer == NULL)
{
perror("Failed to allocate buffer space");
return EXIT_FAILURE;
}

FILE *fp = fopen("data2.txt","r");
if (fp == NULL)
{
perror("data2.txt");
return EXIT_FAILURE;
}

while (fscanf(fp, "%127s", somePointer) == 1)
{
printf("String from file: %s\n", somePointer);
}

fclose(fp);

free(somePointer);

return 0;
}

在上述每种情况下,传递给 fscanfprintf 的参数最终都是指向字符的指针。第一个是通过转换完成的,后两个是明确的。哪一个适用于您的使用需求,我留给您。

剩下的交给你了。祝你好运!

关于无法从 C 中的文本文件中读取所有名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30159038/

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