2012-11-15 53 views
3

我有一个非常简单的问题。我需要在一个文件中的内容读入到C中的字符数组的文件将总是被格式化为信两列,例如:将格式化文件读入C中的char数组中

A B 
B C 
E X 
C D 

每个字母表示在图上一个顶点,其I”稍后会处理。我学习了使用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个空行。任何帮助将是伟大的!

回答

1

当你遍历文件来计算行数时,文件指针已经坐在EOF,所以你不会读取任何数据到你的数组中。充其量它会和你最后一个角色的价值一样,但它可能会向你展示分段错误。

你想要做什么是

rewind(file); 

//read file into the array 

,那么你会在文件的开头开始之前。 另外,我不知道fgetc如何处理行尾,因为坐在那里通常有一个尾随的。你可以这样做的另一种方法是使用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); 

}

新的编辑通知fscanf(file, "%c ", &vertexArray[i]);后的空间。这告诉C你想在阅读角色后跳过所有的空格。没有空间的话,它也会将空白作为一个字符来读取。这应该解决它。

+0

你的建议似乎像它应该工作,但是当我尝试它,我得到一个分段错误。它似乎与倒带(文件)。我也试过fseek(文件,0,SEEK_SET),但同样的事情。我看不出为什么我得到这个。 – DaBurto

+0

对不起,我实际上没有试过这个来告诉你它是否有效,我应该提到这一点。我会_actually_试一下,让你知道。 – Kitchi

+0

由于某些原因,它似乎在阅读额外的行?有了这个代码我的计数= 20使大小= 40,他们应该分别为4和8(或9?包括NULL终止?不知道)。 – DaBurto

0

fgetc提前文件位置指示器。您需要用当前代码回溯到0,或者读取行而不关心行数。

0

当您开始读取数据时,您已经用计算行数来耗尽文件。您必须倒带或重新打开文件。

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 
相关问题