2013-03-18 4 views
0

Когда я типа, например, test \n test и попытаться использовать этот код, чтобы написать этоC мимо новой строки

FILE *f = fopen(file, "w+"); 
fflush(f); 
if (f==NULL) { 
    //perror(f); 
    return 0; 
} 
else{ 
    int i = fprintf(f, "%s", text); 
    if (i>0) { 
     fclose(f); 

     return 1; 
    } 
    else{ 
     fclose(f); 

     return 0; 
    } 
} 

, а затем прочитать его с помощью этой

FILE *f = fopen(file, "r"); 
static char c[100000]; 
const char *d; 
if (f!=NULL) { 
    if (fgets(c, 100000, f) !=NULL){ 
     d = c; 
    } 
    else{ 
     d = "No text"; 
    } 
} 
else{ 
    /* 
    char *ff = f; 
    perror(ff); 
    */ 
    d = "File not found"; 
} 
fclose(f); 

return d; 

это будет только читать и писать test, а не test, новый линия, test. Почему это не будет работать?

+0

Это то, что он говорит на этикетке. – dmckee

+0

«Почему это не будет работать?» - Он работает. Прочтите документацию для 'fgets'. Попробуйте дважды называть эту функцию. –

ответ

5

fgets() функция читает до первого символа новой строки он сталкивается, или останавливается, когда заканчивается место для хранения результата, или когда он получает EOF (так что нет больше данных для чтения).

Последующий звонок fgets() будет собирать информацию после первой новой строки.

Если вы хотите прочитать все сразу, рассмотрите fread(). OTOH, есть проблемы, которые вам придется решать там тоже (в частности: (1) вы можете запросить до 1000 байт, но только получить обратно 20, чтобы ваш код должен был обрабатывать короткие чтения правильно, и (2) fread() не будет отменять строку ввода для вас, в отличие от fgets() и т. Д.).

Когда дело доходит до написания fwrite() было бы логичное дополнение к fread(), но вы можете прекрасно продолжать использовать fprintf() и друг, или fputs() или putc(), или любые из I/O записи функций другого стандарта. Формальных ограничений на «если вы пишете с помощью этих функций, вы должны читать с помощью этих других функций». Это зависит от характера того, что вы пишете и читаете, но вы часто можете переключаться, как кажется наиболее удобным.

+0

Хорошо, но если бы я хотел иметь возможность читать и писать текст с символами новой строки, мне пришлось бы использовать 'fread()' и 'fwrite()'? –

+1

@ChrisLoonam: Вам нужно будет объяснить, как ваши отдельные партии данных с встроенными в него линиями строк разбиты на читаемые единицы. Есть много способов сделать это: например, 2-байтовый счетчик большого числа может предшествовать каждой единице данных, или каждая единица данных помечена нулевым байтом; или ... Что работает, зависит от контекста, который не был задан. –

+1

Проще говоря, если операция чтения не остановится, когда увидит новую строку, она должна остановиться другим способом. Вы должны решить, что это такое, и написать код для его реализации. –

3

http://www.cplusplus.com/reference/cstdio/fgets/

читает символы из потока и сохраняет их в виде строки C в ул до (Num-1) символы были считаны или либо перевод строки или конец файла-достигается, в зависимости от того происходит первый.

Смежные вопросы