我有一个家庭作业任务,要求我通过将它们扫描到灵活的数据结构中,然后搜索使用大写字母的单词来处理.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
的末尾添加大约三行代码。