0

我正在尝试将文件中的单词列表存储到 char*中。我不会假设最大行数或最大字符数。因此,为了解决这个问题,我决定运行 .txt 文件以查找行数和最大字符数,以便为 char * 列表分配内存。

但是,当我使用 GDB 调试我的程序时,它会跳过文件的第二次运行以存储在单词中。为什么会这样,我该如何解决?谢谢!

void readFile(int argc, char** argv)
{
    FILE *myFile;
    char** list;
    char c;
    int wordLine = 0, counter = 0, i;
    int maxNumberOfChars = 0, numberOfLines = 0, numberOfChars = 0;

    myFile = fopen(argv[1], "r");

    if(!myFile)
    {
        printf("No such file or directory\n");
        exit(EXIT_FAILURE);  
    }

    while((c = fgetc(myFile)) !=EOF)
    {
        numberOfChars++;
        if(c == '\n')
        {
            if(maxNumberOfChars < numberOfChars)
                maxNumberOfChars += numberOfChars + 1;

            numberOfLines++;
        }
    }

    fseek(myFile, 0, SEEK_SET);

    list = malloc(sizeof(char*)*numberOfLines);

    for(i = 0; i < wordLine ; i++)
        list[i] = malloc(sizeof(char)*maxNumberOfChars);


    while((c = fgetc(myFile)) != EOF)
    {
        if(c == '\n' && counter > 0)
        {
            list[wordLine][counter] = '\0';
            wordLine++;
            counter = 0;
        }
        else if(c != '\n')
        {
            list[wordLine][counter] = c;
            counter++;
        }
    } 
    fclose(myFile);
}
4

4 回答 4

3

您需要在第二个循环之前使用 fseek 重置文件的读取指针。

添加这样的东西

fseek(myFile, 0, SEEK_SET);

或者

rewind(myFile);

感谢@ThomasPadron-McCarthy。

于 2013-02-09T10:20:00.077 回答
0

首先,你的技术很差,因为它很慢。您可以只分配一些内存,然后在需要更多内存时使用 realloc。

第二:您可以在文件上使用 stat() 来了解大小。您不会知道其中的行数,但它可能很有用。

第三:您可以使用 fseek() 将光标移回文件的开头,通常是文件中的任何位置。

于 2013-02-09T10:21:30.990 回答
0

在再次阅读之前使用 rewind(myFile)。

rewind(myFile)
于 2013-02-09T10:23:09.450 回答
0

但您无需阅读整个文件即可找出字符数。你可以使用这个结构

struct stat file_stat;
fstat(file_id, &file_stat);
int size_to_read = file_stat.st_size - 1;

您不需要知道行数,因为您可以在线使用 realloc:

list=realloc(list,(sizeof(char*)));
于 2013-02-09T10:32:40.770 回答