将格式化文件读入C中的char数组

时间:2012-11-15 08:53:17

标签: c arrays file char

我有一个非常简单的问题。我需要将文件的内容读入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 个答案:

答案 0 :(得分: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后停止。

更新:我认为如果您将ch定义为int ch,它应该有效。看一下this主题。

这是对我有用的代码:

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);

}

NEW EDIT 请注意fscanf(file, "%c ", &vertexArray[i]);之后的空格。这告诉C您想要在阅读完字符后跳过所有空格。没有空间,它也会将空白作为一个角色来阅读。这应该解决它。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

当您开始阅读数据时,您已经耗尽了计算行的文件。您必须快退或重新打开该文件。

答案 3 :(得分: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