3

我有一个非常简单的问题。我需要将文件的内容读入 C 中的 char 数组。该文件将始终格式化为两列字母,例如:

A B
B C
E X
C D

每个字母代表图上的一个顶点,我稍后会处理。我学习过使用 C++ 和 Java 进行编程,但我对 C 并不是特别熟悉。

导致我无法弄清楚的问题是文件有多行长的事实。我需要每个字母占据数组中的一个槽,所以在这种情况下它会是: array[0] = 'A', array[1] = 'B', array[2] = 'B', array[3] = 'C'等等。

最终我需要数组不包含重复项,但我可以稍后处理。这个学期早些时候我写了一个程序,它从一个文件中读取一行整数,它工作得很好,所以我复制了大部分代码,但在这种情况下它不起作用。这是我到目前为止所拥有的:

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

int main (int argc, char *argv[])
{
   int i;
   int count = 0;
   char * vertexArray;
   char ch = '\0';

// open file
   FILE *file = fopen( argv[1], "r" );

// count number of lines in file
   while  ((ch=fgetc(file)) != EOF)
        if(ch == '\n') count++;

// numbers of vertices is twice the number of lines
   int size = count*2;

// declare vertex array
    vertexArray = (char*) calloc(size, sizeof(char));

// read in the file to the array
   for(i=0; i<size; i++)
        fscanf(file, "%c", &vertexArray[i]);

// print the array
   for(i=0; i<size; i++)
        printf("%c\n", vertexArray[i]);

   fclose( file );
}

我知道我需要测试文件打开和正确读取等等,但我稍后会添加。现在只是尝试读取数组。在这种情况下,我的输出是 8 个空行。任何帮助都会很棒!

4

4 回答 4

1

当您遍历文件以计算行数时,文件指针已经位于EOF,因此您不会将任何内容读入数组。充其量它与您最后一个字符的值相同,但它可能会向您显示分段错误。

你想做的是

rewind(file);

在你面前

//read file into the array

那么您将从文件的开头开始。另外,我不确定如何fgetc处理行尾,因为通常会有尾随'\0'坐在那里。您可以这样做的另一种方法是fscanf像这样使用

i = 0;
while (!feof(file)){
   fscanf(file, "%c %c", &vertexArray[i], &vertexArray[i+1]);
   i++;
}

该函数feof(FILE *)检查EOF标志是否已设置,并在您点击 时停止EOF

更新:我认为如果您定义chint ch,它应该可以工作。看看这个线程。

这是对我有用的代码:

int main (int argc, char *argv[])
{
    int i;
    int count = 0;
    char * vertexArray;
    int ch, size;

    FILE *file;
    file = fopen(argv[1], "r");

    while ((ch = fgetc(file) != EOF))
       count++;

    size = count*2;
    vertexArray = (char*) calloc(size, sizeof(char));
    rewind(file);

    for(i=0; i<size; i++)
       fscanf(file, "%c ", &vertexArray[i]);

    for(i=0; i<size; i++)
       fprintf(stderr, "%c\n", vertexArray[i]);

    fclose(file);

}

新编辑注意 . 之后的空格fscanf(file, "%c ", &vertexArray[i]);。这C表明您想在阅读字符后跳过所有空格。如果没有空格,它也会将空格作为字符读取。这应该解决它。

于 2012-11-15T09:21:14.913 回答
0

fgetc推进文件位置指示器。您需要使用当前代码返回 0,或者在不关心行数的情况下读取行数。

于 2012-11-15T08:56:54.450 回答
0

当你开始读入数据时,你已经用尽了文件的行数。您必须倒带或重新打开文件。

于 2012-11-15T08:57:10.463 回答
0

您需要添加fseek(file, 0, SEEK_SET);

您的代码必须看起来:

//Some stuff

// declare vertex array
vertexArray = (char*) calloc(size, sizeof(char));

fseek(file, 0, SEEK_SET);
// read in the file to the array
   for(i=0; i<size; i++)
        fscanf(file, "%c", &vertexArray[i]);

//Some stuff
于 2013-10-13T18:44:44.133 回答