gpt4 book ai didi

c - 读取文件字符串

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

我真的是 C 新手,我想创建一个程序来读取两个仅包含字符串的输入文件。我已经为其相关文件创建了字符串。我正在处理一些问题,但我无法弄清楚,那里存在一些段错误。 (由-ua提问)

这是我的代码:

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

typedef struct linked_list {
char my_data[256];
struct linked_list *next_it;
} node_t;

int main(int argc, char *argv[]) {
/*
if(argc != 4) {
fprintf(stderr, "Requiring 2 input 1 output file name to start!\n");
exit(EXIT_FAILURE);
}*/

FILE *my_s;
FILE *my_f;
// FILE *my_o;
bool mybool = true;
int my_ch; // our char to read
char my_buffer[256];
bool check_all = true;

node_t *set_a = malloc(sizeof(node_t));
node_t *set_b = malloc(sizeof(node_t));
my_f = fopen(argv[1], "r"); // first textfile to read
my_s = fopen(argv[2], "r"); // second textfile to read

if (my_f != NULL && my_s != NULL) {
while (fgetc(my_f) != EOF && mybool != false && check_all != false) {
my_ch = fgetc(my_f);
int i = 0;
while (my_ch >= 0) {
my_buffer[i++] = my_ch;
my_ch = fgetc(my_f);
}
strcpy(set_a->my_data, my_buffer);
if (feof(my_f)) {
mybool = false;
} else {
set_a->next_it = malloc(sizeof(node_t));
set_a = set_a->next_it;
}
}
mybool = false;
printf("First File Copy Done!\n");
while (fgetc(my_s) != EOF && mybool != true && check_all != false) {
my_ch = fgetc(my_s);
int i = 0;
while (my_ch >= 0) {
my_buffer[i++] = my_ch;
my_ch = fgetc(my_s);
}
strcpy(set_b->my_data, my_buffer);
if (feof(my_s)) {
check_all = false;
} else {
set_b->next_it = malloc(sizeof(node_t));
set_b = set_b->next_it;
}
}
printf("Second File Copy Done!\n");
} else {
fprintf(stderr, "Cannot read from %s and %s\n", argv[1], argv[2]);
}

while (set_a != NULL) {
int j = 0;
printf("No: %d, Var: %s",j++, set_a->my_data);
node_t *set_c = set_a;
set_a = set_a->next_it;
free(set_c);
}
while (set_b != NULL) {
int j = 0;
printf("No: %d, Var: %s",j++, set_b->my_data);
node_t *set_c = set_b;
set_b = set_b->next_it;
free(set_c);
}
return 0;
}

最佳答案

您的代码有几个问题:

  • 您使用未初始化的第一个节点初始化列表。无法测试此节点中的任何内容...为什么不将空列表初始化为 NULL
  • 您通过读取每个文件的下一个字节来测试文件结尾,但您不存储该字节......因此它会丢失。稍后您检查 feof(my_s),但该函数并未执行您认为的操作。最好检查 fgetc() 是否返回 EOF,但存储它读取的字节。
  • 为什么每个局部变量名称都以 mymy_ 开头,这没有帮助,只需使用短名称,无论如何,它们不应该指定任何全局变量.
  • 你没有保留指向每个列表头部的指针,你设置了set_aset_b来指向下一个节点,只是没有办法找到不再是名单之首。
  • 在打印和自由循环的每次迭代中将 j 重置为 0,所有节点都将打印数字 0
  • 您应该使用函数来加载、打印和释放列表,以避免重复相同的代码两次。

这是一个改进的版本:

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

typedef struct linked_list {
char *data;
struct linked_list *next;
} node_t;

node_t *load_lines(const char *filename) {
node_t *head = NULL;
FILE *fp = fopen(filename, "r");
if (fp != NULL) {
char buffer[256];
size_t i = 0;
int c;
node_t **tailp = &head;

for (;;) {
c = fgetc(fp);
if (c != EOF && c != '\n') {
if (i < sizeof(buffer) - 1) {
buffer[i++] = c;
}
continue;
}
if (i > 0) {
buffer[i] = '\0';
/* allocate a new node */
*tailp = malloc(sizeof(**tailp));
(*tailp)->next = NULL;
(*tailp)->data = strdup(buffer);
tailp = &(*tailp)->next;
i = 0;
}
if (c == EOF) {
break;
}
}
fclose(fp);
}
return head;
}

void print_word(node_t *np) {
int j = 0;
while (np != NULL) {
printf("No: %d, Var: %s", j++, np->data);
np = np->next;
}
}

void free_words(node_t *np) {
while (np != NULL) {
node_t *next = np->next;
free(np->data);
free(np);
np = next;
}
}

int main(int argc, char *argv[]) {
/*
if (argc != 4) {
fprintf(stderr, "Requiring 2 input 1 output file name to start!\n");
exit(EXIT_FAILURE);
}*/

node_t *set_a, *set_b;

if ((set_a = load_words(argv[1])) != NULL) {
printf("First File Copy Done!\n");
}
if ((set_b = load_words(argv[2])) != NULL) {
printf("Second File Copy Done!\n");
}
if (!set_a && !set_b) {
fprintf(stderr, "Cannot read from %s and %s\n", argv[1], argv[2]);
}

print_words(set_a);
free_words(set_a);
print_words(set_b);
free_words(set_b);
return 0;
}

关于c - 读取文件字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35095861/

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