LINUX.ORG.RU

Бинарь не видит EOF

 


0

2

На собранной билдрутом системе пытаюсь собрать билдрутовским компилятором gcc-4.6.2 для ARM простой код, в результате на стандартный вывод должно выйти содержимое файла tableID.csv (пробовал и другие файлы ситуация такая же) но почему то пройдя до конца файла программа не останавливается а продолжает сыпать какую то чушь:

4889,ENTERMTZ5.setVal,BOOLEAN,E,SG,,,false,38144,4
4890,CONTROLRPV,SPG,S,,,SHM,,38148,4
4891,CONTROLRPV.setVal,BOOLEAN,E,SG,,,false,38148,4
4892,SOUNDDELAY,ING,S,,,SHM,,38152,16
4893,SOUNDDELAY.setVal,INT32,,SG,,,60000,38152,4
4894,SOUNDDELAY.minVal,INT32,,RCF,,,5000,38156,4
4895,SOUNDDELAY.maxVal,INT32,,RCF,,,60000,38160,4
4896,SOUNDDELAY.stepSize,INT32U,E,RCF,,,1000,38164,4
4897,PRISNDVALUE,SPG,S,,,SHM,,38168,4
4898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444.... и так пока не прервешь процесс
Вот код, он работает нормально работает на x86:
#include <fstream>
#include <iostream>
#include <ostream>

using namespace std;

int main()
{
	char ch;
	ifstream infile("tableID.csv");

		while (infile.good())
	{
		infile.get(ch);
		cout<<ch;
	}
	cout << endl;
	return 0;
}

вот еще пример:

#include <iostream>
#include <fstream>
using namespace std;

int main (int argc, char *argv[])
{ 
   char ch;
   ifstream fin("tableID.csv") ;
   if(!fin) {
            cout << "Can not open file\n" ;
            return 1;
   } 
   while (!fin.eof())
   {
       fin>>ch;
       cout<<ch;
   }
   return 0;
}

★★★★★

Последнее исправление: splinter (всего исправлений: 2)

Попробуй добавить в конце ещё одну строку. Старые проги требуют пустую строку в конце файлов. А вообще это баг.

DinoAsm
()
Ответ на: комментарий от splinter

А чего на плюсах-то? Задача достаточно простая.

Как один из вариантов: я бы переписал на Си и под отладчиком посмотрел что этот gcc такого там накомпилял.

Dennis7
()

Так со всеми файлами или только с этим?

По логике, если ты прямо там скомплировал программу, то read() работает корректно.

bk_ ★★
()
Ответ на: комментарий от Dennis7

Это лишь фрагмент используемый в программе.

splinter ★★★★★
() автор топика
Ответ на: комментарий от bk_

со всеми, если ты про а-ля tableID.csv, я удивлен что сама система работает корректно, ведь этим компилятором я собрал busybox-ие утилиты типа less, more и т.п. наверняка там тоже используется подобный алгоритм, но они работают корректно (или busybox написан на c?)

splinter ★★★★★
() автор топика
Ответ на: комментарий от DeVliegendeHollander

к сожалению проверить смогу только завтра. Вообще printf(«%i»,EOF) правильно выводит -1.

splinter ★★★★★
() автор топика
Ответ на: комментарий от splinter

> Вообще printf(«%i»,EOF) правильно выводит -1.

EOF — это сишная константа и на сишные функции рассчитана. у крестов там какой-то свой ад.

arsi ★★★★★
()

char ch

Вспомнил старую «подлянку» с getchar, когда буква «Ъ» весело принималась за EOF ☺

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от mashina

strace просто показывал последнюю строку и замирал не выходя.

splinter ★★★★★
() автор топика
Ответ на: комментарий от arsi

реальных железок хватает, с qemu-arm даже не заморачивался, к тому же оно вроде бы нестабильно.

splinter ★★★★★
() автор топика
Ответ на: комментарий от splinter

> и что там как то не так работает infile.eof() ?

ну дык, иначе этого топике не было бы :) для сравнения можешь написать то же самое на си или ассемблере.

arsi ★★★★★
()
Ответ на: комментарий от kravich
eoftest.cpp: In function 'int main()':
eoftest.cpp:17:22: error: no matching function for call to 'std::basic_ifstream<char>::get(char)'
eoftest.cpp:17:22: note: candidates are:
/mnt/filestore/buildroot-2012.02/output/host/usr/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.6.2/../../../../arm-unknown-linux-uclibcgnueabi/include/c++/4.6.2/istream:283:7: note: std::basic_istream<_CharT, _Traits>::int_type std::basic_istream<_CharT, _Traits>::get() [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::int_type = int]
/mnt/filestore/buildroot-2012.02/output/host/usr/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.6.2/../../../../arm-unknown-linux-uclibcgnueabi/include/c++/4.6.2/istream:283:7: note:   candidate expects 0 arguments, 1 provided
/mnt/filestore/buildroot-2012.02/output/host/usr/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.6.2/../../../../arm-unknown-linux-uclibcgnueabi/include/c++/4.6.2/istream:297:7: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::get(std::basic_istream<_CharT, _Traits>::char_type&) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::char_type = char]
/mnt/filestore/buildroot-2012.02/output/host/usr/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.6.2/../../../../arm-unknown-linux-uclibcgnueabi/include/c++/4.6.2/istream:297:7: note:   no known conversion for argument 1 from 'char' to 'std::basic_istream<char>::char_type& {aka char&}'
/mnt/filestore/buildroot-2012.02/output/host/usr/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.6.2/../../../../arm-unknown-linux-uclibcgnueabi/include/c++/4.6.2/istream:324:7: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::get(std::basic_istream<_CharT, _Traits>::char_type*, std::streamsize, std::basic_istream<_CharT, _Traits>::char_type) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::char_type = char, std::streamsize = int]
/mnt/filestore/buildroot-2012.02/output/host/usr/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.6.2/../../../../arm-unknown-linux-uclibcgnueabi/include/c++/4.6.2/istream:324:7: note:   candidate expects 3 arguments, 1 provided
/mnt/filestore/buildroot-2012.02/output/host/usr/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.6.2/../../../../arm-unknown-linux-uclibcgnueabi/include/c++/4.6.2/istream:335:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::get(std::basic_istream<_CharT, _Traits>::char_type*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>, std::basic_istream<_CharT, _Traits>::char_type = char, std::streamsize = int]
/mnt/filestore/buildroot-2012.02/output/host/usr/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.6.2/../../../../arm-unknown-linux-uclibcgnueabi/include/c++/4.6.2/istream:335:7: note:   candidate expects 2 arguments, 1 provided
/mnt/filestore/buildroot-2012.02/output/host/usr/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.6.2/../../../../arm-unknown-linux-uclibcgnueabi/include/c++/4.6.2/istream:358:7: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::get(std::basic_istream<_CharT, _Traits>::__streambuf_type&, std::basic_istream<_CharT, _Traits>::char_type) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__streambuf_type = std::basic_streambuf<char>, std::basic_istream<_CharT, _Traits>::char_type = char]
/mnt/filestore/buildroot-2012.02/output/host/usr/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.6.2/../../../../arm-unknown-linux-uclibcgnueabi/include/c++/4.6.2/istream:358:7: note:   candidate expects 2 arguments, 1 provided
/mnt/filestore/buildroot-2012.02/output/host/usr/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.6.2/../../../../arm-unknown-linux-uclibcgnueabi/include/c++/4.6.2/istream:368:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::get(std::basic_istream<_CharT, _Traits>::__streambuf_type&) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>, std::basic_istream<_CharT, _Traits>::__streambuf_type = std::basic_streambuf<char>]
/mnt/filestore/buildroot-2012.02/output/host/usr/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.6.2/../../../../arm-unknown-linux-uclibcgnueabi/include/c++/4.6.2/istream:368:7: note:   no known conversion for argument 1 from 'char' to 'std::basic_istream<char>::__streambuf_type& {aka std::basic_streambuf<char>&}'
bash-4.1$ vim eoftest.cpp
splinter ★★★★★
() автор топика
Ответ на: комментарий от kravich

> плюсую попробовать int ch, у K&R на эту тему что-то было

K&R писали книги по с++? новость, однако :)

arsi ★★★★★
()
Ответ на: комментарий от splinter
#include <stdio.h>
#include <stdlib.h>

int main() {
    int c;
    FILE *fp = fopen("test.txt", "r");
    if (fp == NULL)
        exit(EXIT_FAILURE);
    while ((c = fgetc(fp)) > EOF)
        putchar(c);
    if (c == EOF)
        puts("<EOF>");
    return 0;
}

на ARM926EJ-S с ядром 3.3.1 всё работает. собирал arm-none-linux-gnueabi-gcc (Sourcery G++ Lite 2010.09-50) 4.5.1… надо бы обновить как-нибудь %)

arsi ★★★★★
()
Ответ на: комментарий от splinter

а ещё лучше так, без левых библиотек :)

    .arch armv5
    .text
    .global _start
_start:
    mov     r7, #5  @ sys_open
    ldr     r0, =filename
    mov     r1, #0
    swi     #0
    cmp     r0, #0
    blt     exit
    mov     ip, r0  @ fd
    ldr     r1, =buf
    mov     r2, #1
read:
    mov     r7, #3  @ sys_read
    mov     r0, ip
    swi     0
    cmp     r0, #1
    blt     exit
    mov     r7, #4  @ sys_write
    mov     r0, #1  @ stdout
    swi     0
    b       read
exit:
    mov     r7, #1
    swi     #0
    b       exit
    .pool
filename:
    .asciz  "test.txt"

    .data
buf:
    .byte   0
/opt/sgpp/bin/arm-none-linux-gnueabi-as -o test.o test.s
/opt/sgpp/bin/arm-none-linux-gnueabi-ld --strip-all -o test test.o
arsi ★★★★★
()
Ответ на: комментарий от arsi

while ((c = fgetc(fp)) > EOF)

А ежели ошибка какая будет? Надо бы еще внутри цикла «на всякий пожарный» проверку c сделать.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от arsi

забавно что с буффером работает нормально:

int main()
{
	ifstream infile("tableID.csv");	
	cout << infile.rdbuf();
	return 0;
}
Доходит до конца файла и останавливается.

splinter ★★★★★
() автор топика
Ответ на: комментарий от splinter

Блин, ну неужели нельзя такую элементарную операцию на сях реализовать? Вот втарахтелись тебе эти плюсы!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от arsi

у меня тоже нормально отработал.

splinter ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

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

splinter ★★★★★
() автор топика
Ответ на: комментарий от splinter

Ну так операцию считывания на сях сделай. Плюсы же без проблем с сями линкуются.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от mashina
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
) = 53
write(1, "4898,PRISNDVALUE.setVal,BOOLEAN,"..., 534898,PRISNDVALUE.setVal,BOOLEAN,E,SG,,,false,38168,4
... пока не ^C
splinter ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.