c语言 - 无法使用 fget 扫描.txt文件到灵活的数据结构中



我有一个家庭作业任务,要求我通过将它们扫描到灵活的数据结构中,然后搜索使用大写字母的单词来处理.txt文件。我正在使用我使用的这种灵活的数据结构中扫描它们的问题。数据结构需要灵活的原因是它需要能够处理任何.txt文件。

我要使用的数据结构是一个数组,指向包含该行内容的数组。我愿意使用不同的结构(如果更容易(。

我尝试使用fgets通过线路扫描它,并使用malloc分配足以存储该行,但似乎行不通。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STEPSIZE 100
int main()
{
    FILE *inputFile;
    //Opens the file in read mode
    inputFile = fopen("testfile.txt", "r");
    //Error message if file cannot open
    if (inputFile == NULL)
    {
        printf("Unable to open file");
        return 1;
    }
    int arrayLen = STEPSIZE;
    // Allocate space for 100 lines. The **lines is the data structure used to store all the lines
    char **lines = (char **)malloc(STEPSIZE * sizeof(char*));
    char buffer[3000];
    int i = 0;
    while (fgets(buffer, 3000, inputFile))
    {
        //Checks if the array is full, and extends it
        if(i == arrayLen)
        {
            arrayLen += arrayLen;
            char ** newLines = realloc(lines, 200 * sizeof(char*));
            if(!newLines)
            {
                printf("cant reallocn");
            }
            lines= newLines;
        }

        // Get length of buffer
        int lengthOfBuffer = strlen(buffer);
        //Allocate space for string. The +1 is for the terminating character
        char *string = (char *)malloc((lengthOfBuffer + 1) * sizeof(char));
        //copy string from buffer to string
        strcpy(string, buffer);
        //Attach string to data structure
        lines[i] = string;
        //Increment counter
        i++;
        printf("%s", lines[i]);
    }
    //Closes the file
    fclose(inputFile);

    for (int j = 0; j < 100; j++){
        printf("%s n", lines[i]);
    }
    return 0;
}

当循环运行最终时,理想情况下,文件的内容被打印出来,只是表明它已经存储并可以处理,但是目前我获得了退出代码11。

任何帮助将不胜感激。

存在问题:

//Increment counter
i++;
printf("%s", lines[i]);    // you're printing the next file that does not yet exist

正确的代码:

printf("%s", lines[i]);
//Increment counter
i++;

和另一个:

for (int j = 0; j < 100; j++) {  // your loop variable is j
  printf("%s n", lines[i]);     // but you use i here.
}

正确的代码:

for (int i = 0; i < 100; i++) {
  printf("%s n", lines[i]);
}

还有另一个:

  arrayLen += arrayLen;
  char ** newLines = (char**)realloc(lines, 200 * sizeof(char*));
  // here the new length of your array is inconditionally 200
  // but actually the new array length is arrayLen 

正确的代码:

  arrayLen += arrayLen;
  char ** newLines = (char**)realloc(lines, arrayLen * sizeof(char*));

可能还有更多问题,我没有检查所有内容。

btw:sizeof(char)从定义上是1,因此您可以将其丢弃。

btw2:arrayLen += arrayLen;您确定这是您想要的吗?您每次都会使阵列的大小加倍。这不一定是错误的,但是使用此方法,阵列长度将很快增长到很大的数字。您可能想要这个:arrayLen += STEPSIZE;

btw3:

while (fgets(buffer, 3000, inputFile))

这实际上不是错误的,但是您最好写下:

while (fgets(buffer, sizeof buffer, inputFile))

消除了两个硬编码常数3000

btw4:最后,您只打印了前100行您已读取。您应该能够纠正此。

btw5:您还应该释放分配的所有内存。我把这个作为练习给你。提示:在main的末尾添加大约三行代码。

相关内容

  • 没有找到相关文章

最新更新