C 为什么strtok with \n只读取txt文件的第一行?

C 为什么strtok with \n只读取txt文件的第一行?,c,C,我在使用strtok时遇到了一些问题,我正在尝试用C语言编写的代码从文本文件中读取,但是,只读取第一行,因为出于某种原因,变量arq在第一行之后变为NULL 文本: ola oi a b e z 代码: strtok不会从文件中读取,它会分割字符数组。根据定义,fgets()读取包含尾随换行符(如果文件中存在)的单行,因此strtok()仅拆分单个项目。您应该尝试使用fread()读取整个文件,而不是fgets(),并在strtok()循环之前以null终止数组: #include <s

我在使用strtok时遇到了一些问题,我正在尝试用C语言编写的代码从文本文件中读取,但是,只读取第一行,因为出于某种原因,变量
arq
在第一行之后变为
NULL

文本:

ola
oi
a
b
e
z
代码:


strtok
不会从文件中读取,它会分割字符数组。根据定义,
fgets()
读取包含尾随换行符(如果文件中存在)的单行,因此
strtok()
仅拆分单个项目。您应该尝试使用
fread()
读取整个文件,而不是
fgets()
,并在
strtok()
循环之前以null终止数组:

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

void le_arquivo(char *optarg) {
    FILE *respostas;                
    char *arq;                      
    char resp[SBUFF];              
    char *tokens[SBUFF];           
    int n, c;

    respostas = fopen(optarg, "r");
    if (respostas == NULL) {
        printf("Erro ao abrir o arquivo\n");
        return;
    }
    n = fread(resp, 1, sizeof(resp) - 1, respostas);
    resp[n] = '\0';
    arq = strtok(resp, "\n");
    for (c = 0; arq != NULL; c++) {
        tokens[c] = arq;
        arq = strtok(NULL, "\n");
    }
    fclose(respostas);
    organiza_dados(tokens, c);
}
#包括
#包括
void le_arquivo(char*optarg){
文件*respostas;
char*arq;
charresp[SBUFF];
字符*令牌[SBUFF];
int n,c;
respostas=fopen(optarg,“r”);
if(respostas==NULL){
printf(“Erro ao abrir o arquivo\n”);
返回;
}
n=fread(resp,1,sizeof(resp)-1,respostas);
resp[n]='\0';
arq=strtok(resp,“\n”);
for(c=0;arq!=NULL;c++){
令牌[c]=arq;
arq=strtok(空,“\n”);
}
fclose(respostas);
organiza_dados(代币,c);
}

非常感谢!你帮了我很多!成功了!我花了几天的时间在怀疑中!非常感谢。
#include <stdio.h>
#include <string.h>

void le_arquivo(char *optarg) {
    FILE *respostas;                
    char *arq;                      
    char resp[SBUFF];              
    char *tokens[SBUFF];           
    int n, c;

    respostas = fopen(optarg, "r");
    if (respostas == NULL) {
        printf("Erro ao abrir o arquivo\n");
        return;
    }
    n = fread(resp, 1, sizeof(resp) - 1, respostas);
    resp[n] = '\0';
    arq = strtok(resp, "\n");
    for (c = 0; arq != NULL; c++) {
        tokens[c] = arq;
        arq = strtok(NULL, "\n");
    }
    fclose(respostas);
    organiza_dados(tokens, c);
}