2012-01-15 45 views
0

我需要在表格中读取x*[tab]*y*[tab]*z*[tab]\n*格式的数据,所以我使用fopenfgetc来流式传输字符。当c==EOF环路正在结束。 (c是字符。) 但是我遇到了困难,因为它溢出了我的数组。做一些调试后,我意识到,在最后一行后,打开的文件包含:使用fopen打开C文本文件后,它具有附加字符

北安普顿牛津68 ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ[...]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍýýýý««««««««îþîþ

那是什么?为什么这不会出现在我的纯文本文件中?我如何克服这个问题?

destination = fopen("ukcities.txt", "rt"); // r = read, t=text 

if (destination != NULL) { 
    do { 
     c = fgetc (destination); 
       if (c == ' ') { 
       temp_input[i][n] = '\0'; 
       i++; 
       n=0; 
       } else if (c == '\n') { 
        temp_input[i][n] = '\0'; 
        printf("%s %s %s \n", temp_input[0], temp_input[1], temp_input[2]); 
        i = 0; 
        n=0; 
       } else { 
        temp_input[i][n] = c; 
        n++; 
       } 
     } while (c != -1); 

    return 1; 
} else { 
    return 0;  
} 
+1

投票结束:您还没有提供您的代码,因此很难说出这里提出的问题。 – 2012-01-15 20:56:57

+3

'fgetc'和“c是字符”不匹配。 'fgetc'返回一个'int'。如果你将它的返回值存储在更小的东西中,你将会被烧毁。 – Mat 2012-01-15 20:58:34

+0

Í的字节值是0xcd。谷歌0xcdcdcdcd并采取第一击。 – 2012-01-15 21:03:47

回答

2

展望我的水晶球,我看到fread或者你使用任何(显然这是fgetc这使得它更真实的)不空终止数据读取和你想将其打印为C字符串。用NUL字符终止数据(一个0),然后它将正确打印。

+0

哈哈哈,你有一个相当闪亮的水晶球,那里有先生;) – ScarletAmaranth 2012-01-15 20:57:45

+3

零字符是NUL;零指针是NULL。他们都是空的。 – 2012-01-15 20:58:12

0

该字符串看起来没有终止。在C中,不以'\0'字符(a.k.a.空字符)结尾的字符串会导致不断的麻烦,因为很多标准库和系统库希望字符串以空字符结尾。

确保当您读完所有数据后,该字符串被终止;在某些情况下,它必须手动完成。有几个方法可以做到这一点(下使空字符串的所有字符,所以只要你不覆盖的最后一个,该字符串将永远是空值终止):

// (1) declare an array of char, set all characters to null character 
char buffer[1000] = {0}; 

或者,如果你跟踪你在哪里缓冲区,你也可以这样做:

// (2) after reading in all data, add the null character yourself: 
int n; // number of bytes read 
char buf[1000]; 

// read data into buf, updating n 

buf[n] = '\0'; // (tip: may need to use buf[n+1]) 

在这两种情况下,你不超越了缓冲区的结尾是很重要的。如果您只分配了1000个字节,则只能使用999个字节,并为空字符保存1个字节。

+0

你也可以像'char buffer [x] = {}'一样将大括号留为空白,以初始化所有元素为 – 2012-01-15 21:24:41

+0

@SethCarnegie:我不确定C是否为真;具体来说,在GCC中用'-pedantic'编译'char [1000] = {}',它说ISO C禁止空初始化列表。 – dreamlax 2012-01-15 21:43:09

+0

'char [1000] = {0};'在标准C中.' – nos 2012-01-15 21:49:28