从文件中读取时如何区分新行和EOF

时间:2016-09-12 18:16:07

标签: c binary calculator

我正在尝试构建一个程序,可以添加任意长度的二进制数,用空格分隔。我不希望受到最大数字长度的限制,因此我在没有内置数字类型的情况下做任何事情,只有字符。我从文件中读取数字。我在堆栈上执行所有操作。 我无法循环读取的部分并添加数字。我的猜测是,因为我无法找到区分新线和EOF的方法。程序以这种方式工作:我读取第一个数字并将其保存到第一个堆栈,然后我读取第二个数字并保存在第二个堆栈中。然后我将其添加,保存到第三个堆栈并将其传输到第一个堆栈。我读下一个数字,保存到第二个堆栈,加起来等等。所以我基本上想循环第二次读数和求和。这是源代码部分:

    while( !isspace(c=(char)getc(ifp))) {
    if( c == '0' || c == '1'){
        if(!push(&a , c)){
            clearStack(&a);
            printf("alloc error");
            return 0;
        }
    }else{
        clearStack(&a);
        printf("error1");
        return 0;
    }
}
if( a.size == 0 ){
    printf("error2");
    return 0;
}

while (!feof(ifp)) {

while( !isspace(c=(char)getc(ifp))) {
    if( c == '0' || c == '1'){
        if(!push(&b , c)){
            clearStack(&a);
            clearStack(&b);
            printf("alloc error");
            return 0;
        }
    }
    else{
        //clearStack(&a);
        //clearStack(&b);
        printf("error3");
        //return 0;
    }
}
if( b.size == 0 ){
    if (a.size == 0){
    printf("error4");
    }
}


topA = a.size;
topB = b.size;

carry = 0;
while( topA > 0 || topB > 0) {
    if ( ( topA > 0 ) ){
        topA--;
        if(a.data[topA] == '1'){
            x = 1;
        }else{
            x = 0;
        }
    }else{
        x = 0;
    }
    if ( ( topB > 0 ) ){
        topB--;
        if(b.data[topB] == '1'){
            y = 1;
        }else{
            y = 0;
        }
    }else{
        y = 0;
    }
    sum = x + y + carry;
    if (sum == 2 || sum == 3){
        carry = 1;
    }else{
        carry = 0;
    }       
    if (sum == 1 || sum == 3) {
        c = '1';
    }else{
        c = '0';
    }
    if(!push(&output , c)){
        clearStack(&a);
        clearStack(&b);
        clearStack(&output);
        printf("alloc error");
        return 0;
    }
} 
if (carry == 1) {
    if(!push(&output , '1')){
        clearStack(&a);
        clearStack(&b);
        clearStack(&output);
        printf("alloc error");
        return 0;
    }
}

clearStack(&a);

for (i=0; i < output.size; i++){
push(&a , output.data[i]);
}

clearStack(&b);
clearStack(&output);

} /*end of EOF while*/

出于某种原因,虽然它读取了多次,但它读错了,仅适用于2个数字。该文件看起来像这样:“1 1”,但当它的“1 1 1”时,它只会添加前2个数字。我不知道我在哪里弄错了。下面我附上整个源代码。我在控制台中调用这个程序:./ program file。我知道这个案例描述不好但不能以更好的方式做到,如果需要的话,我会添加评论。

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

struct stack {
char *data;
int size;
};  
int push(struct stack * s, char c){
char * newData = (char *)realloc( s->data , (s->size + 1) * sizeof(char));
if( newData ){
    s->data = newData;
    s->data[s->size]=c;
    s->size++;
    return 1;
}else{
    return 0;
}
}

/* not needed */

char pop(struct stack * s){
if(s->size > 0){
    char result = s->data[s->size-1];
    char * newData = (char *)realloc( s->data , s->size - 1);
    if( newData ){
        s->data = newData;
        s->size--;
        return result;
    }else{
        return 0;
    }

}
else{
    return 0;   
}
}


struct stack newStack(){
struct stack s;
s.data = NULL;
s.size = 0;
return s;
}

void clearStack(struct stack * s){
free(s->data);
s->data = NULL;
s->size = 0;
}

int main (int argc, char const * argv[])
{
struct stack a = newStack();
struct stack b = newStack();
int topA, topB, x , y, carry, sum,i , start;
struct stack output = newStack(); 
char c;
FILE *ifp;

if(argc!=2){printf("Usage: ./a.out input_file."); return(1);}
if(!(ifp = fopen(argv[1], "r"))){printf("Unable to open input file!"); return(2);}



while( !isspace(c=(char)getc(ifp))) {
    if( c == '0' || c == '1'){
        if(!push(&a , c)){
            clearStack(&a);
            printf("alloc error");
            return 0;
        }
    }else{
        clearStack(&a);
        printf("error1");
        return 0;
    }
}
if( a.size == 0 ){
    printf("error2");
    return 0;
}

while (!feof(ifp)) {

while( !isspace(c=(char)getc(ifp))) {
    if( c == '0' || c == '1'){
        if(!push(&b , c)){
            clearStack(&a);
            clearStack(&b);
            printf("alloc error");
            return 0;
        }
    }
    else if (c == '\0' || c == ' ' || c == '\n'){
    }
    else{
        //clearStack(&a);
        //clearStack(&b);
        printf("error3");
        //return 0;
    }
}
if( b.size == 0 ){
    if (a.size == 0){
    printf("error4");
    //return 0; 
    }
}

topA = a.size;
topB = b.size;

carry = 0;
while( topA > 0 || topB > 0) {
    if ( ( topA > 0 ) ){
        topA--;
        if(a.data[topA] == '1'){
            x = 1;
        }else{
            x = 0;
        }
    }else{
        x = 0;
    }
    if ( ( topB > 0 ) ){
        topB--;
        if(b.data[topB] == '1'){
            y = 1;
        }else{
            y = 0;
        }
    }else{
        y = 0;
    }
    sum = x + y + carry;
    if (sum == 2 || sum == 3){
        carry = 1;
    }else{
        carry = 0;
    }       
    if (sum == 1 || sum == 3) {
        c = '1';
    }else{
        c = '0';
    }
    if(!push(&output , c)){
        clearStack(&a);
        clearStack(&b);
        clearStack(&output);
        printf("alloc error");
        return 0;
    }
} 
if (carry == 1) {
    if(!push(&output , '1')){
        clearStack(&a);
        clearStack(&b);
        clearStack(&output);
        printf("alloc error");
        return 0;
    }
}

clearStack(&a);

for (i=0; i < output.size; i++){
push(&a , output.data[i]);
}

clearStack(&b);
clearStack(&output);

} /*end of EOF while*/

for (i=a.size - 1; i >= 0; i--){
    if(a.data[i] == '1' || start){
        start=1;
        printf("%c", a.data[i]);
    }
}
printf("\n");



clearStack(&a);
//clearStack(&b);
//clearStack(&output);
return 0;
}

0 个答案:

没有答案