gpt4 book ai didi

c - fgets() 不读取文本文件?

转载 作者:行者123 更新时间:2023-11-30 17:43:48 25 4
gpt4 key购买 nike

我有一个函数loadsets()(加载设置的缩写),它应该从名为Progsets.txt的文本文件加载设置。 loadsets() 成功时返回 0,检测到 fatal error 时返回 -1。然而,实际上Progsets.txt读取的代码部分(三个fgets())似乎全部失败并返回空指针,因此除了一堆空值之外根本不加载任何内容。我的代码有问题吗?当我运行代码时,fp 是一个有效的指针,并且我能够打开它进行阅读。那么出了什么问题?

此代码用于使用 cmd 加载我的非常基本的文本编辑器程序的默认文本颜色。

标题:

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

#define ARR_SIZE 100

struct FINSETS
{
char color[ARR_SIZE + 1];
char title[ARR_SIZE + 1];
char maxchars[ARR_SIZE + 1];
} SETTINGS;

负载集():

int loadsets(int* pMAXCHARS) // load settings from a text file
{
FILE *fp = fopen("C:\\Typify\\Settings (do not modify)\\Progsets.txt", "r");
char *color = (char*) malloc(sizeof(char*) * ARR_SIZE);
char *title = (char*) malloc(sizeof(char*) * ARR_SIZE);
char *maxchars = (char*) malloc(sizeof(char*) * ARR_SIZE);
char com1[ARR_SIZE + 1] = "color ";
char com2[ARR_SIZE + 1] = "title ";
int i = 0;
int j = 0;
int k = 0;
int found = 0;

while (k < ARR_SIZE + 1) // fill strings with '\0'
{
color[k] = title[k] = maxchars[k] = '\0';
SETTINGS.color[k] = SETTINGS.maxchars[k] = SETTINGS.title[k] = '\0';
k++;
}

if (!fp) // check for reading errors
{
fprintf(stderr, "Error: Unable to load settings. Make sure that Progsets.txt exists and has not been modified.\a\n\n");
return -1; // fatal error
}

if (!size(fp)) // see if Progsets.txt is not a zero-byte file (it shouldn't be)
{
fprintf(stderr, "Error: Progsets.txt has been modified. Please copy the contents of Defsets.txt to Progsets.txt to manually reset to default settings.\a\n\n");

free(color);
free(title);
free(maxchars);

return -1; // fatal error
}

// PROBLEMATIC CODE:

fgets(color, ARR_SIZE, fp); // RETURNS NULL (INSTEAD OF READING FROM THE FILE)
fgets(title, ARR_SIZE, fp); // RETURNS NULL (INSTEAD OF READING FROM THE FILE)
fgets(maxchars, ARR_SIZE, fp); // RETURNS NULL (INSTEAD OF READING FROM THE FILE)

// END OF PROBLEMATIC CODE:

system(strcat(com1, SETTINGS.color)); // set color of cmd
system(strcat(com2, SETTINGS.title)); // set title of cmd
*pMAXCHARS = atoi(SETTINGS.maxchars);

// cleanup

fclose(fp);
free(color);
free(title);
free(maxchars);

return 0; // success
}

Progsets.txt:

COLOR=$0a;
TITLE=$Typify!;
MAXCHARS=$10000;

编辑:这是 size() 函数的定义。由于我只处理 ASCII 文本文件,因此我假设每个字符都是一个字节,并且可以通过计算字符数来计算出文件大小(以字节为单位)。有什么可疑的吗?

尺寸():

int size(FILE* fp)
{
int size = 0;
int c;

while ((c = fgetc(fp)) != EOF)
{
size++;
}

return size;
}

最佳答案

问题在于您对 size() 函数的使用。它在文件句柄上重复调用 fgetc() 直到到达文件末尾,并增加一个值来跟踪文件中的字节数。

这不是一种方法(尽管我确信有更好的方法,不涉及低效的基于字符的 I/O),但它确实有一个致命> 你似乎忽略了一个缺陷。

调用它后,您已将文件从头到尾读取,以便进一步读取,例如:

fgets(color, ARR_SIZE, fp);

将会失败,因为您已经位于文件末尾。在从 size() 返回之前,您可能需要考虑类似 rewind() 的操作 - 这会将文件指针放回到文件的开头,以便您可以读取它再次。

关于c - fgets() 不读取文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20172236/

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